[英]Understanding Big O notation derived from code
我為一些二叉樹問題寫了一些代碼......代碼如下:它一直向下留下一個答案是肯定的,而答案是否正確,如果它到達一個,則返回外部節點。
用java寫的,
public static int price(BinaryTree<Integer> t, boolean[] p) {
Position<Integer> root = t.root(); //1
while (t.isInternal(root)) { //2
int element = root.element(); // 3
if (!p[element]) { //4
root = t.getRight(root);//5
}
if (p[element]) { //6
root = t.getLeft(root); //7
}
}
int price = root.element(); //8
return price; //9
}
在計算Big OI時,最好在上面的注釋中對代碼的步驟進行編號...我從這里開始遵循示例
所以1-9以上應該等同於這樣的東西,其中C
是常量而且???
是我的循環(其中N是給定數據結構的輸入數)
C + ??? + C + ??? + C + ??? + C + C + C
我的while
循環是我認為C*N
或(O(N))
而不是現在的C*N
)和我的兩個if
語句應該是(對於索引的時間復雜度O(1)
...和O(N)
空間復雜性,我現在會堅持時間復雜度)
所以現在我應該(刪除C
元素導致它們是常量並且並不重要)
C*N + C + C
表示時間復雜度
和
空間復雜度為C*N + C*N + C*N
我有意思
C*N
或O (N)
用於時間復雜度和空間復雜度
O(3N)
可被視為O(N)
......
所以我的問題是,我是否正確地做了這件事,如果不是我哪里出錯了?
謝謝
編輯:
樹向左移動提供真實(是)答案或權利給出否。 對於樹中的m個內部節點,內部節點編號為0到m-1。 因此,如果在根,內部節點0處給出no,因此向右移動,則此內部節點可能是節點3,因此布爾答案在p [3]而不是p [1],因為p [1]是答案對於節點1,即問題1.道歉是為了混淆
是的,不是。
該算法確實是O(n)
,因為您“觸摸”每個元素不會超過常數次。
但是,這不是嚴格的約束,換句話說 - 它不是Theta(n)
,它是Theta(logN)
。 (請記住,大O只是上限)。
這是因為樹是平衡的,並且您的算法基本上是從根到樹中的某個葉子的路徑。 請注意,一旦你“選擇”左/右,你永遠不會回去。 所以基本上你只在每個高度“觸摸”一個節點一定次數,使你的算法成為O(h)
- 其中h
是樹的高度。
由於樹是平衡的, h < C * log(n)
,對於某些常數C
- 這使得算法Theta(logN)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.