假设您有一个大小为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)...
答案 0 :(得分:5)
你的等式基本上是triangular numbers的等式,总和为 N(N + 1)/ 2 。我会让你从那里确定O()
!
更快的方法是构造一个与原始列表相反的新列表,然后对其执行操作。
答案 1 :(得分:2)
您的算法是 O(n ^ 2),正如您在帖子中所建议的那样。不过,你可以在 O(n)中完成。
重要的是要记住,Big-O表示法是算法时间复杂度的上限。
答案 2 :(得分:2)
1+2+3+...+n = n*(n+1)/2 = 0.5 * n ^ 2 + O(n)
这是O(n ^ 2),O(n ^ 2)是紧的,即没有包含运行时的较低运行时顺序。
从前到后工作的更快的算法可能有O(n)而不是O(n ^ 2)
答案 3 :(得分:1)
您的运行时分析是正确的,运行时为1 + 2 + ... + N,它是sum of the arithmetic progression因此=(N²-N)/ 2.