根據Wikibooks,如果所有點已經排序,Andrew算法將以線性時間運行。我們將採取排序積分的情況。安德魯算法(複雜船體)的時間複雜度
然而,在僞代碼,它說:
for i = 1, 2, ..., n:
while L contains at least two points and the sequence of last two points
of L and the point P[i] does not make a counter-clockwise turn:
remove the last point from L
append P[i] to L
現在,在這裏我們可以看到一個for循環和嵌套的內部for循環while循環。根據我的邏輯推理,如果循環內有一個循環,它就不能具有線性時間複雜度。
我在哪裏犯錯? 謝謝!
編輯:通過分析代碼,我推斷以下。
for i loop--------O(n)
while loop----O(i-2) worst case
remove----O(1)
append--------O(1)
現在,如果while循環的時間複雜度爲O(n),則總體複雜度爲O(n^2)。但因爲它更小,整體的複雜性應該是O((i-2)* n),我認爲它比O(n)大,因爲我增加到n ...
我不太確定正確計算這個...
非常好的答案。它通過攤銷分析得出結論。 –
真正優雅的解釋!只要我讀它就知道了......謝謝Javatar! :) – Leta