这个函数O(N)的时间复杂度是多少?

时间:2016-08-18 22:59:02

标签: algorithm time-complexity

这个功能的时间复杂度是多少?该函数返回数组中的最小值。我认为它是O(N),但我无法证明这一点。任何帮助将不胜感激!

int[] foo(int arr[], int N)
{
   int k = 1;
   while(k < N)
   {
      for(int i = 0; i+k<N; i+=2*k) 
      {
         if(arr[k] > arr[i+k])
         {
            swap(arr[i], arr[k+i]); //swap values in arr[i] and arr[k+1]
         }
      }
      k = k*2;
   }

   return arr[0];
 }

1 个答案:

答案 0 :(得分:3)

这是O(N)

乍一看似乎是O(NlogN),但是:

  • 第一个内循环:i = 0, 2, 4, 6, 8, ...,即N/2次操作
  • 第二内圈for循环:i = 0, 4, 8, 12, 16, ...N/4次操作
  • 第3个内部for循环:i = 0, 8, 16, 24, 32, ...,即N/8次操作
  • 第4个内循环:i = 0, 16, 32, 48, 64, ...,即N/16次操作

N/2 + N/4 + N/8 + N/16 + ... = N(1/2 + 1/4 + 1/8 + 1/16 ...) = N

https://en.wikipedia.org/wiki/1/2_%2B_1/4_%2B_1/8_%2B_1/16_%2B_%E2%8B%AF