这个操作的数据结构是什么?
说我有两个数组,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=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)的时间?
我对此问题的解决方案是使用存储pair
结构作为其节点值的max-heap
。如果你不熟悉堆,CLRS book, chapter 6有我读过的最好的讨论。
堆的方法max-heapfiy
最大到最高,这样任何特定节点的子节点都比父节点的值低。您可以将此属性用作删除子节点和维护堆属性的条件。在你的情况下,当插入节点的能量和分数都大于特定子节点时,听起来你可能会删除整个子树,并且只有在能量或分数较大时才删除单个节点。
虽然我认为最大堆是一个好的开始,但是您能否澄清一下处理这些对结构的细节。我会想,顺序函数必须遵守一些规则,如**传递性**(这可能是由于OR导致的上述排序定义的问题)。尽管如此,我认为基于最大堆的方法(使用其中的2个;记录内部吞吐量)可能是有效解决方案的核心。 – sascha
在要求中,“分数和能量的不足或相等”有点含糊。如果解决方案将'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; } 最终的结果是'能量'或'得分'都不在最上面,但是它们的一对是按照要求排序的。 –
很明显如何实现这个顺序关系。但它遵循的规则,这可能是:'''需要严格的弱排序'('传递+ irreflexive)? – sascha
那么关系数据库中的表就可以支持这一点。那是你的追求?这是一个非常广泛的问题。 –
这是一个有趣的问题,但它更像是一个适合http://cstheory.stackexchange.com/而不是SO的问题。 – Enigmativity
@ Nick.McDermaid,我想用我选择的语言(C#)实现这个数据结构,所以我不知道关系数据库表在这里如何帮助。如果你能详细说明,我会很感激。 –