通常情况下,如果使用深度优先遍历,我们会得到O(n)
时间。但是,如果我们先找到最小元素然后调用successor()
方法n
次,那么它的复杂度会是多少?
我认为它可能是O(n log n)
,因为继承者是O(log n)
,但这似乎不对。任何人都可以在这里提供任何深入的分析(可能涉及一些限制分析)吗?
答案 0 :(得分:7)
如果每个节点都存在父指针,则调用后续方法n次需要O(n)时间。要看到这一点,观察到树中的每个边缘最多被访问两次(一次从父到子,一次从子到父)由所有后继调用组合。因此,所有后继呼叫所访问的边缘总数最多为2n。所以运行时间是O(n)。
现在如果不存在父指针,则在每次调用中我们必须从根开始并通过遍历O(log n)节点(如果树是平衡的)来搜索后继元素。因此复杂性变为O(n log n)。
答案 1 :(得分:0)
不是一个正式的论点,但对O(n)而言是一个相当令人信服的论点:
后继函数始终采用从起始节点到其后继节点的最短路径。它要么下降要么上升,但一旦它开始做一个它不能改变到另一个。因此,它必须采取最短的路径。
后继函数必须产生与深度优先方法相同的输出,因此它必须以相同的顺序访问相同的节点(即输出的节点,它不必经过相同的节点,尽管它确实)。
深度优先方法也始终采用每个输出节点之间的最短路径(在每一步中,它都向下或向上,而不是两者)。
因此,每个方法都采用完全相同的路径,实际上是等价的。