我需要帮助弄清楚为什么 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;
}
Run Code Online (Sandbox Code Playgroud)
    考虑一个通用的数字区间可能会有所帮助,比如1 到 100。
但是,如果每次通过 loop 时循环步长的大小都发生变化,则会得到不同的结果:
所以在你的例子中,你的外循环 O(n) 乘以你的内循环 O(log n),导致组合 O(n * log n)。
在这个答案中可以找到不同时间复杂度的很好的例子。