在任意树中查找n个最大节点

时间:2017-08-20 15:47:49

标签: algorithm tree

给定任意树(不是二叉树),每个节点都标记为整数。 如何在树中找到n个最大的节点? 例如 如果树包含{43,453,48,62,91,641},并且要求3个最大节点,则该算法应返回< 641,253,91&gt ;.

允许使用所有c ++(或任何语言)标准库函数/数据结构。 它也允许向节点添加字段,只要它是恒定的空间使用。就像,我可以为每个节点添加一个字段,让它指向它最大的子节点,但我不能有一个ArrayList来按排序顺序存储它的所有子节点。

作为一名新程序员,我在这个问题上花了好几天时间。一个简单的图搜索算法(BFS,DFS)可以工作并且易于实现,但它们不够快,因为它们都在对整个树进行详尽的搜索。

你能帮我找到一个正确而快速(呃)解决这个问题的方法吗?

2 个答案:

答案 0 :(得分:3)

  

作为一名新程序员,我在这个问题上花了好几天时间。一个简单的图搜索算法(BFS,DFS)可以工作并且易于实现,但它们不够快,因为它们都在对整个树进行详尽的搜索。

由于您的树不是二叉树,因此检查节点不会产生有关其子节点的其他信息。因此,如果不对整个树进行穷举搜索,就不可能实现产生K个最高值的算法。换句话说,你获得的性能不会超过任意值的无序数组。

要在O(N * log K)时间内获取K值,在遍历任意树时保持priority queue个K元素。

答案 1 :(得分:0)

由于给定的树是任意的,没有特殊属性。要找到1个最高价值的孩子,您需要搜索整个图表。它的复杂性O(n)。

对于顶级K最高价值儿童,

您有一个O(N * log K)时间 - 基于优先级队列的解决方案,如dasblinkenlight答案中所述。

你也有{(3)}的O(N)时间解决方案。