數據結構與算法_渡劫3

  • 正在學習的算法課程:極客時間的王爭老師的《數據結構與算法之美》
  • 傳送門: https://time.geekbang.org/column/126
  • 目前學到第三講,很良心,共56講,推薦想學數據結構的同學
    2019/09/23

一、時間複雜度分析(二)

四個複雜度分析:

  • 最好情況時間複雜度

  • 最壞情況時間複雜度

  • 平均情況時間複雜度

  • 均攤時間複雜度(沒懂

二、最好、最壞情況時間複雜度

  • 最好情況時間複雜度:理想情況中,最佳情況下,執行這段代碼的時間複雜度

  • 最壞情況時間複雜度:理想情況中,最差情況下,執行這段代碼的時間複雜度

上代碼


// n 表示數組 array 的長度

int find(int[] array, int n, int x) {

  int i = 0;

  int pos = -1;

  for (; i < n; ++i) {

    if (array[i] == x) pos = i;

  }

  return pos;

}

複雜度:O(n)

優化後的代碼:


// n 表示數組 array 的長度

int find(int[] array, int n, int x) {

  int i = 0;

  int pos = -1;

  for (; i < n; ++i) {

    if (array[i] == x) {

       pos = i;

       break;

    }

  }

  return pos;

}

存在最好的情況,複雜度爲O(1);

存在最差的情況,複雜度爲O(n)

三、平均情況時間複雜度

  • 平均時間複雜度:全稱加權平均時間複雜度或者期望時間複雜度

上述代碼,極端考慮,存在兩種情況,查找的數據在數組中和不在數組中。

簡化之後,平均時間複雜度爲O(n)

四、均攤時間複雜度

上代碼,c#,c#不懂,一直用的是python


 // array 表示一個長度爲 n 的數組

 // 代碼中的 array.length 就等於 n

 int[] array = new int[n];

 int count = 0;

 

 void insert(int val) {

    if (count == array.length) {

       int sum = 0;

       for (int i = 0; i < array.length; ++i) {

          sum = sum + array[i];

       }

       array[0] = sum;

       count = 1;

    }



    array[count] = val;

    ++count;

 }

最理想情況:O(1)

最差的情況:O(n)

平均複雜度:O(1)

平均複雜度分析


真不會c#,明天問問大佬

五、課後作業

時間複雜度分析


// 全局變量,大小爲 10 的數組 array,長度 len,下標 i。

int array[] = new int[10]; 

int len = 10;

int i = 0;



// 往數組中添加一個元素

void add(int element) {

   if (i >= len) { // 數組空間不夠了

     // 重新申請一個 2 倍大小的數組空間

     int new_array[] = new int[len*2];

     // 把原來 array 數組中的數據依次 copy 到 new_array

     for (int j = 0; j < len; ++j) {

       new_array[j] = array[j];

     }

     // new_array 複製給 array,array 現在大小就是 2 倍 len 了

     array = new_array;

     len = 2 * len;

   }

   // 將 element 放到下標爲 i 的位置,下標 i 加一

   array[i] = element;

   ++i;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章