【发布时间】:2011-01-23 19:38:20
【问题描述】:
假设你有一个大小为 N 的链表,并且你想对每个元素执行一个操作,从末尾开始。
我想出了以下伪代码:
while N > 0
Current = LinkedList
for 0 to N
Current = Current.tail
end
Operation(Current.head)
N := N-1
end
现在我必须确定这个算法是哪个 Big-O。
假设 Operation() 是 O(1),我认为它是这样的:
N + (N-1) + (N-2) + ... + (N-(N-1)) + 1
但我不确定 Big-O 到底是什么。我认为它肯定比 O(N^2) 小,但我认为你也不能说它的 O(N) ...
【问题讨论】:
-
1+2+3+...+n = n*(n+1)/2 这是 O(n^2)
-
我不太了解你的结构,你有一个名为 Current 的 LinkedList(它看起来像一个节点),它有尾部和头部?如果您打算上一个/下一个,那么它是双重链接的;如果它们确实是头/尾,那么上面的代码根本没有意义。
-
@bestsss:嗯,你可以说 LinkedList 是一个对象,每次我进入 While-Loop 时,我都会在 Current 中引用它。在 Current(即 LinkedList)上调用“head”,返回实际的 Element,“tail”返回另一个 LinkedList 对象,包含,嗯,tail...
-
好吧 :) 好吧,你有奇怪的想法如何命名“下一个”/“元素”。头/尾通常在节点(本身)之外用于链接列表的指定节点。无论哪种方式,您都有嵌套循环,几乎自动意味着 n2。如果您需要反向处理单个链表,请先对其进行逆向处理,然后再对其进行逆向处理。比你现在拥有的要快得多。逆是O(n),过程是O(n),再逆是O(n)。
标签: linked-list big-o pseudocode