在动态数组的前N个元素中查找最大元素

时间:2017-02-25 19:32:26

标签: algorithm

我正在寻找一种有效的算法或数据结构来在多重集合的前N个元素中通过第二个参数找到最大元素,其中我会做多个,所以我不能使用分段树。任何想法?

注意:我有多个成对的对象。

1 个答案:

答案 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))。