给定任意树(不是二叉树),每个节点都标记为整数。 如何在树中找到n个最大的节点? 例如 如果树包含{43,453,48,62,91,641},并且要求3个最大节点,则该算法应返回< 641,253,91&gt ;.
允许使用所有c ++(或任何语言)标准库函数/数据结构。 它也允许向节点添加字段,只要它是恒定的空间使用。就像,我可以为每个节点添加一个字段,让它指向它最大的子节点,但我不能有一个ArrayList来按排序顺序存储它的所有子节点。
作为一名新程序员,我在这个问题上花了好几天时间。一个简单的图搜索算法(BFS,DFS)可以工作并且易于实现,但它们不够快,因为它们都在对整个树进行详尽的搜索。
你能帮我找到一个正确而快速(呃)解决这个问题的方法吗?
答案 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)时间解决方案。