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

问题描述:

说我有两个数组,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#)实现这个数据结构,所以我不知道关系数据库表在这里如何帮助。如果你能详细说明,我会很感激。 –

我对此问题的解决方案是使用存储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