这个操作的数据结构是什么?

时间:2016-08-22 00:11:06

标签: c# arrays data-structures

假设我有两个数组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-如果任何项目具有更多或相等的分数和能量,则返回;

2-如果任何项目得分和能量较少或相等,请删除此项目;

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)时间?

1 个答案:

答案 0 :(得分:1)

我对此问题的解决方案是使用max-heap存储pair结构作为其节点的值。如果您不熟悉堆,CLRS book, chapter 6有最好的讨论,我已经读过它们。

堆的max-heapfiy方法将最大值冒泡到顶部,这样任何特定节点的子节点都具有低于其父节点的值。您可以使用此属性作为删除子节点和维护堆属性的条件。在您的情况下,当插入节点的能量和分数都大于特定子节点时,听起来您可能正在删除整个子树,并且只有当能量或分数更大时才删除单个节点。