我正在寻找一种有效的算法或数据结构来在多重集合的前N个元素中通过第二个参数找到最大元素,其中我会做多个,所以我不能使用分段树。任何想法?
注意:我有多个成对的对象。
答案 0 :(得分:1)
您可以使用您熟悉的任何平衡二进制搜索树实现。可以说最着名的是AVL树,红黑树。
通常,二叉搜索树描述会提到存储在树节点中的键和值对。钥匙从左到右排序。插入,删除和查找操作使用O(log(n))时间复杂度,因为树是平衡的。树旋转通常支持平衡。
为了能够在一系列元素上找到最大值,您必须在每个树节点中存储和维护其他信息,即节点子树中的 maxValue 和 size < / strong>的子树。为节点定义递归函数,以在其子树的前N个节点中查找最大值。如果N等于大小,您将在当前节点的 maxValue 中得到答案。否则,如果某些元素在threir子树中,则调用左/右节点的函数。
F(node, N) =
if N == size[node] : maxValue[node]
else if N <= size[leftChild[node]] :
F(leftChild[node], N)
else if N == size[leftChild[node]] + 1 :
MAX(F(leftChild[node], N), value[node])
else :
MAX(maxValue[leftChild[node]],
value[node],
F(rightChild[node], N - size[leftChild[node]] - 1)
如果您熟悉分段树,则不会遇到此实现的任何问题。
我建议您使用 Treap 。这是随机二叉树。由于这种随机性,树总是保持平衡,为基本操作提供O(log(n))时间复杂度。 Treap DS有两个基本操作拆分和合并,所有其他操作都是通过其用途实现的。 treap的一个优点是你不必处理轮换。
编辑:无法在每个节点中明确地维护 maxKey / minKey O(log(n))。