在树中找到最大n个节点的算法

时间:2014-11-21 13:42:27

标签: algorithm search tree

让我们假设我们有一个节点保存一些数字的树。 我需要在这棵树中找到n个最大的数字。 我脑子里有两种算法:

1.使用BFS或DFS迭代树并将其节点放在一个数组中,然后使用快速排序作为示例对其进行排序,并返回n个第一个元素。 该方法的时间复杂度为O(| V | + | E | + | V | log | V |)空间为O(| V |)

2.其次是迭代树查找最大元素并将其标记n次。所以时间复杂度为O(N *(| V | + | E |))空间也是O(| V |)。

哪种解决方案更好,也许我的方法错误,并且有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

标准heap选择算法不起作用?

基本算法是(假设k是您要选择的项目数)

create an empty min-heap
for each node (depth-first search)
    if heap.count < k
        heap.Add(node)
    else if node.Value < heap.Peek.Value()
        heap.RemoveSmallest()
        heap.Add(node)

完成for循环后,您的堆中包含k个最大值。您可以按升序获得它们:

while heap.count > 0
    output (heap.RemoveSmallest().Value)

如果您希望它们按升序排列,请将它们从堆中移除到数组中,然后反转数组。

此算法为O(n log k),其中n是树中的节点数,k是您想要的项目数。