日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构杂谈番外篇——时间复杂度计算

發布時間:2023/12/9 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构杂谈番外篇——时间复杂度计算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們先給出推導的方法,然后下面一步一步來推導。

推導大O階

  • 用常數1取代運行時間中的所有加法常數
  • 在修改后的運行次數函數中,只保留最高階項
  • 如果最高階存在且不是1,則去除這個項相乘的常數
  • 所得結果即為大O階
  • 示例

    int sum = 0,n = 100; //以分號結尾,代碼執行一次 sum = (1+n)*n/2 //執行一次 cont<<sum<<endl; //執行一次

    運行次數為3,而在上面推導的推導大O階方法中我們說了,用1代碼所有的加法,什么意思呢?我們的3是經過1+1+1算出來的,我們用1代替所有的加法。而這個表達式只有1,沒有最高階項,所以結果1即為大O階。我們把具有O(1)的時間復雜度的叫做常數階。

    int i; for(i = 0;i<n;i++) {/*其他常數階程序代碼*/ }

    我們可以發現,花括號里的就是常數階,而for循環循環了n次,也就是說,做了n+常數階次執行次數,根據上面推導大O階方法,我們找到了最高階項n,舍棄后面常數項,所以我們的時間復雜度為O(n),我們把這類情況稱為線性階。

    順便一提,一般來說,我們分析算法的時間復雜度,關鍵就是分析循環結構的運行情況。

    int count = 1; while(count < n) {count = count * 2;/*其他常數階程序代碼*/ }

    從這里的代碼我們可以看出,退出循環的條件是count<n,而count是通過自身乘2來更新自我然后跳出循環的。也就是說,設count更新次數為x,其可以寫出2x=n2^{x}=n2x=n的式子,而我們大O(n)里面的n實際上指的是這里的x,根據高中數學所學的指對互換,我們可以寫出x=log2nx = log_2nx=log2?n。所以這個循環的時間復雜度為O(logn),我們把這類情況叫做對數階。

    int i ,j ; for (i - 0; i < n; i++) {for ( j - 0 ; j < n ; j++ ){/*時間復雜度為O(1)的程序步驟序列*/} }

    對于這種就不必多說了,時間復雜度為O(n2)(n^2)(n2)。我們把這類情況叫做平方階。

    說完上面所有的情況了,現在我們來幾個題來練手。

    x = 0;y = 0; for(int k = 0;k<n;k++){x++; } for(int i = 0;i<n;i++){for(int j = 0;j<n;j++){y++;} }

    分析算法,根據推導大O階方法,第一行執行1次,第一個循環執行n次,第一個內嵌循環外層n次,內層n次,也就是n的平方。把常數變為1,然后抓大頭,最高項系數為1,那么只剩下n2n^2n2。所以該代碼的時間復雜度為O(n2)(n^2)(n2),從完整的代碼分析下來我們也可以發現,實際上我們只需要找最復雜的那個循環開始分析就可以了,因為其他的代碼所含的時間復雜度最終根據推導大O階方法都會被省略。下面看一個比較難的例子。

    void exam(fload x[][],int m,int n) {float sum[];for(int i = 0;i<m;i++){sum[i] = 0.0;for(int j = 0;j<n;j++){sum[i]+=x[i][j];}}for(i = 0;i<m;i++)cout<<i<<":"<<sum[i]<<endl; }

    最復雜的就是中間的內嵌循環,外層循環為從0到m,內層循環0到n,所以該時間復雜度應為O(m+n)。

    for(i = 1;i<=n;i++)for(j = 1;j<=n;j++){c[i][j]=0;for(k = 1;k<=n;k++)c[i][j] = c[i][j]+a[i][k]*b[k][j];}

    上面這個是一個N×N矩陣相乘的算法,連續三層循環,第一次執行次數為n,第二層執行次數也為n,第三層執行次數還是n。所以該題算法復雜度為O(n3)(n^3)(n3)

    for(i = 1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x = x+1;

    這里最外層執行次數n,但是最外層執行1次,第二層就循環1次;最外層執行第2次,第二層循環兩次;根據等差數列求和公式,即第二層有1+2+3+…+n,即n(1+n)2\frac{n(1+n)}{2}2n(1+n)?次。當然第三層就不好理解了,所以我們接下來換一種方法。

    對于三層循環問題,我們還是直接列出最外層的前幾項比較好。在i = 1的時候,內層循環全部加起來只循環一次。在i = 2的時候,第二層循環啟動兩次循環,所以總共執行1+2,對于i = 3,第二層啟動三次循環,第三層也是三次循環。也就是說總共執行1+2+3。如果聽不太懂,我們可以用圖來表示,即:

    所以實際上以上規律是由n來控制的,從上面的圖來看的話,根據我們所得規律,i=1里面有一個i(1+i)2\frac{i(1+i)}{2}2i(1+i)?,i = 2里面也有一個i(1+i)2\frac{i(1+i)}{2}2i(1+i)?,以此類推我們可以寫出下面的式子:∑i=1ni(i+1)2\sum^n_{i=1}\frac{i(i+1)}{2}i=1n?2i(i+1)?

    我們化簡一下上面的式子:∑i=1n(i22+i2)=12∑i=1n(i2?i)\sum^n_{i=1}(\frac{i^2}{2}+\frac{i}{2}) = \frac1 2\sum^n_{i=1}(i^2-i)i=1n?(2i2?+2i?)=21?i=1n?(i2?i)

    這里用等差求和公式帶入求解,即可得出答案n(n+1)(n+2)6\frac{n(n+1)(n+2)}{6}6n(n+1)(n+2)?,根據我們前面說的大O階推導,可以得出本題的時間復雜度為n3n^3n3

    總結

    以上是生活随笔為你收集整理的数据结构杂谈番外篇——时间复杂度计算的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。