簡體   English   中英

理解從代碼派生的Big O表示法

[英]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時,最好在上面的注釋中對代碼的步驟進行編號...我從這里開始遵循示例

大O,你如何計算/近似它?

所以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*NO (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM