2009-06-25 5 views
1

データベースに格納され、ORM(具体的にはDjangoのORM)を介してアクセスできる順序付けられたオブジェクトのリストがあります。リストはユーザーによって任意にソートされており、私はそれを追跡するために何らかの方法が必要です。そのために、各オブジェクトには、他のオブジェクトとの関係でその順序を指定する「順序」プロパティがあります。リスト内のオブジェクトの「注文」プロパティのデータ構造

この注文フィールドでソートするために使用するデータ構造は、リクエスト時に再作成する必要がありますので、作成は安価でなければなりません。私はしばしば複数のオブジェクト間の比較を使用します。また、挿入では、データベースのすべての行を更新する必要はありません。

どのようなデータ構造を使用しますか?

+0

"order"プロパティとして整数を使用して、単一または二重リンクリストとして実装された優先度キューとの違いがわかりません。あなたの状況が一意になるような制約がありますか? –

+1

ソート順はDBに保存する必要がありますか? – shahkalpesh

+0

はい、ソート順は各オブジェクトのDBに格納されます(1オブジェクト== 1行)。 – Zain

答えて

1

ヒープ

例えば、(格納された値に依存する)値に比較してstd::setc++)によって実装されるように値による整数、文字列による順序付けなどがあります。注文やアクセスには適していますが、並べ替えを行う必要があるときは確実ではありません。挿入中は常にそうです。

他にどのような制約があるのか​​を指定していません。要素の数が分かっていて、メモリ内に固定配列を保持することが合理的または可能である場合、各位置はインデックスによって指定されます。固定数の要素を仮定します。

操作を頻繁に実行するかどうかを指定していません。 値を一度ロードしてから変更せずにアクセスすると、作成に1つのアルゴリズムを使用して、インデックスまたはトランスフォームストレージを使用して高速アクセスを使用できるようになります...

+0

私は私のポストにいくつかの情報を追加しました。申し訳ありませんが、まだここに新しい:) – Zain

1

リンクされたリスト(二重)?

+0

比較は線形ではありません。私は潜在的にa> bかどうかを調べるためにリストの残りの部分をスキャンしなければならないだろう。 – Zain

+0

順序付きリンクリストへの挿入および削除は、線形時間a.k.a O(N)です。あなたが探している価値を見つけるためにN回の反復の上限があります。 –

+0

エラー - またはむしろリニアになります。打ち間違え。ありがとう、stefanB。 – Zain

1

私はあなたが一定の時間(しかし、償却された一定の時間?)。

私はバイナリツリーを使用し、パスを記述するビットシーケンスを "注文プロパティ"として使用できます。

関連する問題