2016-08-22 50 views
1

說我有兩個數組,energy (E) and score (S),他們能有這樣的內容:這個操作的數據結構是什麼?

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

我要的是最好的能量的最好成績。哪些數據結構可以支持插入的方式的項目,我沒有擁有的項目使用更少的能源和更少的分數比其他項目i.e. for any i,j where i!=j => score[i] > score[j] || energy[i] > energy[j]

插入時,我做的三個步驟:

1,如果任何項目有更多或同等的分數和能量,回報;如果有任何項目的分數和能量較少或相等,請刪除此項目;

3-插入所需的項目。

以下是一些示例: 1-插入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

這是一個有趣的問題,但它更像是一個適合http://cstheory.stackexchange.com/而不是SO的問題。 – Enigmativity

+0

@ Nick.McDermaid,我想用我選擇的語言(C#)實現這個數據結構,所以我不知道關係數據庫表在這裏如何幫助。如果你能詳細說明,我會很感激。 –

回答

1

我對此問題的解決方案是使用存儲pair結構作爲其節點值的max-heap。如果你不熟悉堆,CLRS book, chapter 6有我讀過的最好的討論。

堆的方法max-heapfiy最大到最高,這樣任何特定節點的子節點都比父節點的值低。您可以將此屬性用作刪除子節點和維護堆屬性的條件。在你的情況下,當插入節點的能量和分數都大於特定子節點時,聽起來你可能會刪除整個子樹,並且只有在能量或分數較大時才刪除單個節點。

+0

雖然我認爲最大堆是一個好的開始,但是您能否澄清一下處理這些對結構的細節。我會想,順序函數必須遵守一些規則,如**傳遞性**(這可能是由於OR導致的上述排序定義的問題)。儘管如此,我認爲基於最大堆的方法(使用其中的2個;記錄內部吞吐量)可能是有效解決方案的核心。 – sascha

+0

在要求中,「分數和能量的不足或相等」有點含糊。如果解決方案將'score'和'energy'看作'comparator()'的兩個參數,那麼你可以得到如下的結果: int comparator(pair p,pair q)if(p.energy> q。 energy && p.score> q.score){return 1;如果(p.energy == q.energy && p.score == q.score){ return 0; } return -1; } 最終的結果是'能量'或'得分'都不在最上面,但是它們的一對是按照要求排序的。 –

+0

很明顯如何實現這個順序關係。但它遵循的規則,這可能是:'''需要嚴格的弱排序'('傳遞+ irreflexive)? – sascha