让我们假设我们有一个节点保存一些数字的树。
我需要在这棵树中找到n个最大的数字。
我脑子里有两种算法:
1.使用BFS或DFS迭代树并将其节点放在一个数组中,然后使用快速排序作为示例对其进行排序,并返回n个第一个元素。
该方法的时间复杂度为O(| V | + | E | + | V | log | V |)空间为O(| V |)
2.其次是迭代树查找最大元素并将其标记n次。所以时间复杂度为O(N *(| V | + | E |))空间也是O(| V |)。
哪种解决方案更好,也许我的方法错误,并且有更好的解决方案?
答案 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
是您想要的项目数。