簡體   English   中英

以下嵌套 for 循環的 Big-O class 是什么?

[英]What is the Big-O class of the following nested for loop?

我需要幫助弄清楚為什么 Java 中的以下代碼片段是 O(nlogn) 而不是 O(n^2)。 請問有什么幫助嗎?

int sumSome(int[] arr){
   int sum = 0;
   for (int i=0; i<arr.length;  i++) {
      for (int j=1; j<arr.length; j = j*2) {
         if (arr[i] > arr[j])
            sum += arr[i];
      }
   }
   return sum;
}

考慮一個通用的數字區間可能會有所幫助,比如1 到 100

  • 如果您一個接一個地遍歷該間隔,則循環將是 O(n)
  • 如果你以任何線性步長循環遍歷它,比如一次 2 個或一次 10 個,循環將是 O(n/2)、O(n/10) 等,仍然簡化為 O(n )。

但是,如果循環步驟的大小每次通過 loop 都發生變化,則會得到不同的結果:

  • 如果您在每次將步長加倍(1、2、4、8、16、32、64)的同時遍歷該范圍,那么您最終將只運行循環 7 次才到達終點。 這是步長的指數增長,對應於循環中的對數次數:1 + log(100),log base 2(向下舍入),簡化為 O(log n)。
  • 如果每次將步長乘以 3(1、3、9、27、81),它將循環 1 + log(100) 次,log base 3,仍然簡化為 O(log n)。 等等。

所以在你的例子中,你有你的外循環 O(n) 乘以你的內循環 O(log n),導致一個組合的 O(n * log n)。

這個答案中可以找到不同時間復雜度的很好的例子。

暫無
暫無

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

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