2016-08-22 18 views
1

は、私は2つのアレイ、energy (E) and score (S)を持っており、彼らはこのような要素を持っている可能性が言う:この操作のためのどのデータ構造ですか?

E = {1 , 3 , 4, 7}; 
S = {16, 10, 5, 1}; 

私が欲しい最高のエネルギーで最高のスコアです。

1 - 任意の項目がある場合:私はi.e. for any i,j where i!=j => score[i] > score[j] || energy[i] > energy[j]

を挿入する他の項目より少ないエネルギーと少ないスコアでアイテムを持っていない方法でアイテムを挿入するサポートすることができますどのようなデータ構造で、私は3つの手順を行いますより多くのまたは等しいスコアとエネルギーを持っています。

2つ以上のアイテムにスコアとエネルギーがある場合は、このアイテムを削除します。

3必要な項目を挿入します。

ここにいくつかの例があります: 1- insert e = 8、s = 1。アレイはなる:

E = {1 , 3 , 4, 8}; 
S = {16, 10, 5, 1}; 
       ^

2-インサートe=5s=6。配列は、

E = {1 , 3 , 5, 8}; 
S = {16, 10, 6, 1}; 
      ^

3-挿入e = 5、s = 11になります。配列は次のようになります。

E = {1 , 5 , 8}; 
S = {16, 11, 1}; 
     ^ (3,10) is removed because (5,11) has more energy and more score than it. 

O(logn)時間でこれをサポートできるデータ構造は何ですか?

+0

よくリレーショナルデータベースのテーブルがこれをサポートしています。それはあなたの後のことですか?非常に広い質問です。 –

+1

これは面白い質問ですが、SOの代わりにhttp://cstheory.stackexchange.com/に適した質問のようです。 – Enigmativity

+0

@ Nick.McDermaid、私は選択した言語(C#)を使用してこのデータ構造を実装したいので、リレーショナルデータベーステーブルがどのように役立つかはわかりません。あなたがもっと精巧にできるなら、私は感謝します。 –

答えて

1

この問題の解決方法は、ノードの値としてpair構造体を格納するmax-heapを使用することです。あなたがヒープに慣れていないなら、CLRS book, chapter 6は私がそれらを読んだ最も良い議論を持っています。

max-heapfiyヒープのメソッドは、特定のノードのすべての子がすべて親よりも低い値になるように、最大​​値を上に上げます。このプロパティは、サブノードを削除してヒーププロパティを維持するための条件として使用できます。あなたのケースでは、挿入されたノードのエネルギーとスコアの両方が特定の子よりも大きい場合はサブツリー全体を削除し、エネルギーやスコアが大きい場合はノードを1つだけ削除するように思えます。

+0

私は最大ヒープが良いスタートだと思いますが、これらのペア構造を扱う詳細については少し明確にすることができますか?注文機能は**推移性**のようないくつかの規則に従わなければならないと思っていたでしょう(これはORのために上記の注文定義の問題かもしれません)。それにもかかわらず、私は最大ヒープベースのアプローチ(これらのうち2つを使用し、内部スワップが記録されている場合)が効率的なソリューションの中核になると考えています。 – sascha

+0

要件では、「スコアとエネルギーがそれ以下である」とはあまりあいまいです。解が 'score 'と' energy'を 'comparator()'の2つのパラメータとして見れば、次のようになります。 intコンパレータ(ペアp、ペアq){ if(p.energy> q)エネルギー&& p.score> q.score){ return 1; } else if(p.energy == q.energy && p.score == q.score){ return 0; } 戻り値-1; } 最終結果は、「エネルギー」も「スコア」もトップにはないが、それらのペアは要件に従って順序付けされている。 –

+0

この順序関係を実装する方法は明らかです。しかし、それはおそらく、「厳密な弱い順序が必要だ」というルールに従っているのだろうか?(推移的+非再帰的)? – sascha

関連する問題