簡體   English   中英

我不太確定我的算法的大 O 是 O(n^3) 還是 O( m * n * n )

[英]I'm not quite sure if the Big O of my algorithm is O(n^3) or O( m * n * n )

所以,我試圖在下面找到我的算法的大 O。

for(int x=0;x<m;x++){
    for(int y=0;y<n;y++){
        for(int z=0;z<n;z++){
            if(target[x][y]==source[z]) count++;
        }
    }
}

但是,我不太確定它是 O(n^3) 還是 O( m * n * n )...

除了嵌套之外,每個循環都獨立於其他循環,因此它是每個循環次數的簡單乘法:O(m * n * n) = O(m * n 2 )。

這意味着性能將隨着m增加線性擴展,隨着n增加呈二次方擴展。 如果兩者都增加,則性能將根據其產品進行擴展。

除非mn之間存在某種未說明的關系,否則這不能推廣到 O(n 3 )。 恰恰相反,如果沒有關系,您甚至可以考慮算法 O(m)(如果您對縮放n時會發生什么不感興趣)或 O(n 2 )(如果您對什么不感興趣)當m縮放時發生)。


請注意,這種搜索可以在 O(m + n 2 ) 中完成。

  1. 創建一個集合。
  2. 對於sourcem元素中的每一個,
    1. 讓我們將s稱為當前元素的值。
    2. 如果集合不包含s
      1. s添加到集合中。
  3. 對於targetn*n元素的每個元素,
    1. 讓我們稱v為當前元素的值。
    2. 如果集合包含s
      1. 加一count

這假設集合查找是 O(1) 並且添加到集合是 O(1)(攤銷)。

在我看來它是O(m*n*n) ,也就是O(m*n 2 ) ,因為您的外循環在m上迭代,但您的兩個內循環都在n迭代。

循環 O(n)。 循環內循環 O(n*n) 或 O(n^2)。 在另一個循環內循環 O(n*n*n) 或 O(n^3)。

你的最外層循環依賴於 n 還是 m? 當然,您不能因為沒有外循環而忽略外循環。

因此,來自彼此內部的三個循環的 O(m*n*n) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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