2016-04-27 9 views
3

私はURLのショートネーマーを作っています。与えられたURLごとに最短の文字列を使いたいと思います。各URLの有効期限は異なります。 cが短いので、cの有効期限が切れたので、次のURLの代わりにbbcに短縮されなければならないと言う、その後最短の長さのすべての文字列を繰り返し処理するアルゴリズムですか?

a, b, c, ..., z, 0 ..., 9, aa, ab, ac, ... a9, ba

:たとえば

、のは、以下のリストに短縮ますURLを提出してみましょう服用されていません。

これを把握するにはどのようなデータ構造が適していますか?

答えて

1

これは楽しい問題です。これにはいくつかのデータ構造が必要です。これは私がやることです。

1)短いURLをキーとし、すべてのURL情報(完全なURL、有効期限など)を値として持つハッシュテーブル。

2)有効期限が切れたURLの最小ヒープ。これにより、利用可能な最短URLをすばやく取得して再利用できます。

3)使用中の最長短縮URLを記録する文字列。これにより、有効期限が切れていないURLがあればすぐに新しいURLを生成することができます。

4)有効期限を追跡するために、URLを効率的に期限切れにすることができます。これは、Date - > ShortURLという形式のハッシュテーブルで、順序付けされたキーを使用することで、次に有効期限のあるURLを簡単に取得できます。

1

コンパレータのネストされたルールを持つプライオリティキューを使用します。最初は空または取られたフラグで、2番目はフラグです。 PQは最も待ち望まれているオブジェクトをキューの上に保持します。結果としてあなたのオブジェクトは、文字列名とブール値フラグの複合体でなければなりません。

+0

A PQが働かないヒープに挿入しますしかし、任意の数のエントリについては、制限がなければならない。 – Cisplatin

+0

私が知っているわけではありません。プログラムで制限されていない限り、PQは[無制限](https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html)です。 – mohsenmadi

+0

あなたはそうです、実際には簡単な方法があります。しかし、もう1つの問題は、大量の要素が追加されると、永遠にPQに入り、多くの領域を占めることです。私はそれらを日常的にクリアできると思います。 – Cisplatin

1

2ヒープを使用します。

  1. 未使用URLの最小ヒープ。ここで、最小値はURLです。
  2. 使用されたURLの最小ヒープ。最小値は、1970年1月1日(long値)からの秒数です。あなたは新しいURLが必要な場合

、ヒープURLの有効期限が切れる1の上から引く、ヒープ2からURLを引くと1

関連する問題