假设我有两个数组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=5
,s=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)
我对此问题的解决方案是使用max-heap
存储pair
结构作为其节点的值。如果您不熟悉堆,CLRS book, chapter 6有最好的讨论,我已经读过它们。
堆的max-heapfiy
方法将最大值冒泡到顶部,这样任何特定节点的子节点都具有低于其父节点的值。您可以使用此属性作为删除子节点和维护堆属性的条件。在您的情况下,当插入节点的能量和分数都大于特定子节点时,听起来您可能正在删除整个子树,并且只有当能量或分数更大时才删除单个节点。