2011-02-12 11 views
2

まず、質問は宿題に関する質問です。 私は実装について十分に長い間熟考してきました。借用ライブラリのデータ構造

私は、以下の機能を持っているライブラリソフトウェアを考えると、実装する必要があります。

  1. 新たな加入者を追加/削除します。
  2. 本を借りる/返す
  3. 次の加入者はどの書籍を持っていますか?
  4. どの加入者が以下の本を保有していますか?
  5. ほとんどの書籍を持つサブスクライバのリスト。

私はヒープと2つの赤い黒い木を実装することを考えましたが、スペースの複雑さが高いという問題があります。だから私は何か不足しているのだろうかと思っていた。

ユーザはIDで保存され、書籍にはコード名があります。 レッド・ブラック・ツリーは購読者用で、もう1つは借用した書籍用です。 最後の要件を実装するために、ヒープは最大のヒープです。

データ構造以外は使用できません。

ありがとうございました洞察と回答。

+0

拡張できますか?あなたのR-Bツリーは、サブスクライバと書籍のためのものですか?たぶんハッシュテーブルはここで検討する価値があります。また、req 5のためのヒープは過度のように思えますが、二重にリンクされたリストの二重にリンクされたリストを使って、借用/復帰操作ごとにO(1)時間オーバーヘッドでそれを追跡することが可能でなければなりません。しかし、それはおそらくあなたの人のオブジェクトがDLLの知識を必要とすることを意味します。これは設計の観点からはうまくありません。 –

+0

さて、あなたは1つのrbが購読者のためのものであり、1つは借りられた本のためのものです。そしてそれはちょうどそのための過剰ですが、私は加入者のリストを返す必要がありますO(n)はいいですが、これはO(n)のようにすることはできません。私はデータ構造を結合することを強くお勧めし、ハッシュテーブルを使ってEAVモデリングパターンを実行すると、検索に時間がかかります(おそらくO(n)、衝突があるかもしれません)。 – Cu7l4ss

答えて

0

構造体のようなコンテナを使用することもできますか?用途:

  • 1個のハッシュセット/書籍のハッシュテーブル:
    さらに本が借りていると、加入者は、それが借りていますかどうかを決定するフラグを格納します。
  • サブスクライバ - >リンクリストの1つのハッシュマップで、すべてのサブスクライバだけでなく、借用しているブックも格納できます。

これにより、O(1)でリストされたすべてのタスクを実行できます。ただし、サブスクライバを借りた本の数でソートする点が異なります。

+0

私は実際には基本的なデータ構造(私がコースで学んだもの)だけを使用しなければならないので、私はかなり限られています、それ以外の場合は私はtreapを使ってしまいました。ヒープとしての本。 – Cu7l4ss

+0

@ Shlomiこれらのプリミティブなデータ構造をリストできますか? –

+0

@Dave BST、RBツリー、ハッシュテーブル、リンクリスト(ダブルとシングル)、スタック、キュー、最小/最大ヒープを使用できます。私は他のデータ構造を拡張することができますが、その正しさ(とその特性)を証明する必要があります。 – Cu7l4ss