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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

关于时间复杂度

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于时间复杂度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?http://www.doc88.com/p-70321160970.html

【轉】算法的時間復雜度

?算法的時間復雜度是衡量一個算法效率的基本方法。在閱讀其他算法教程書的時候,對于算法的時間復雜度的講解不免有些生澀,難以理解。進而無法在實際應用中很好的對算法進行衡量。

《大話數據結構》一書在一開始也針對算法的時間復雜度進行了說明。這里的講解就非常明確,言簡意賅,很容易理解。下面通過《大話數據結構》閱讀筆記的方式,通過原因該書的一些簡單的例子和說明來解釋一下算法的時間復雜度和它的計算方法。 首先從基本定義下手,來了解一下什么是“算法的時間復雜度”,《大話數據結構》一書中對算法的時間復雜度定義如下: “算法語句總的執行次數 T(n) 是關于問題規模 n 的函數,進而分析 T(n) 隨 n 的變化情況并確定 T(n) 的數量級。算法的時間復?? ? ? ? ? ? ? ?雜度,也就是算法的時間度量,記作:T(n) = O(f(n)) 它表示隨問題規模 n 的增大,算法執行時間的增長率和f(n) 的增長率 ? ? ? ? ? ? ? ? ? ? ? ? ?相同,稱作算法的漸進時間復雜度,簡稱為時間復雜度。其中 f(n) 是問題規模 n 的某個函數?!? 光從定義來理解算法的時間復雜度還是比較難的,我們再結合一個簡單的例子來說明。計算 1 + 2 + 3 + 4 + ...... ?+ 100 = ? 這樣的問題想必大家都遇到過,這里我們通過 C 語言用最簡單的方法實現一下這個問題的算法。 int sum = 0, n = 100; ? ? ? ?//執行了 1 次 for (int i = 1; i <= n; i++) { ? ? ? ?//執行了 n + 1 次 sum += i; ? ? ? ?//執行了 n 次 } printf(" sum = %d", sum); ? ? ? ?//執行了 1 次 從代碼附加的注釋可以看到所有代碼都執行了多少次。那么這寫代碼語句執行次數的總和就可以理解為是該算法計算出結果所需要的時間。所以說,上述結算?1 + 2 + 3 + 4 + ...... ?+ 100 = ?的算法所用的時間(算法語句執行的總次數)為 : 1 + ( n + 1 ) + n + 1 = 2n + 3 而當 n 不斷增大,比如我們這次所要計算的不是?1 + 2 + 3 + 4 + ...... ?+ 100 = ? 而是?1 + 2 + 3 + 4 + ...... ?+ n = ?其中 n 是一個十分大的數字,那么由此可見,上述算法的執行總次數(所需時間)會隨著 n 的增大而增加,但是在 for 循環以外的語句并不受 n ?的規模影響(永遠都只執行一次)。所以我們可以將上述算法的執行總次數簡單的記做: 2n 或者簡記 ?n 這樣我們就得到了我們設計的計算?1 + 2 + 3 + 4 + ...... ?+ 100 = ?的算法的時間復雜度,我們把它記作: O(n) 對于同一個問題,解法通常是不唯一的。比如?1 + 2 + 3 + 4 + ...... ?+ 100 = ?這個問題,還有其他的不少算法。我們再來看一個數學家高斯解決這個問題的算法(想必大家都很熟悉這個故事)。 SUM =?1 + 2 + 3 + 4 + ...... ?+ 100 SUM = 100 + 99 + 98 + 97 + ...... + 1 SUM + SUM = 2*SUM = 101 + 101 + 101 + .... + 101 ? ? ? ? ?正好 100 個 101 SUM = ?(100*101)/2 = 5050 同樣我們將這個解法翻譯成 C 語言代碼: int n = 100, sum = 0; ? ? ? ?//執行 1 次 sum = (n*(n + 1))/2; ? ? ? ?//執行 1 次 printf("sum = %d", sum); ? ? ? ?//執行 1 次 這樣我們針對同一個?1 + 2 + 3 + 4 + ...... ?+ 100 = ?問題,不同的算法又的到了一個算法的時間復雜度: O(3) ? ?一般記作 O(1) 我們后續給出原因。 從感官上我們就不難看出,從算法的效率上看,O(3) < O(n) 的,所以高斯的算法更快,更優秀(是最優秀的嗎?)。 這種用個大寫的 O 來代表算法的時間復雜度的記法有個專業的名字叫“大O階”記法。那么通過對上述的例子進行總結,我們給出算法的時間復雜度(大O階)的計算方法。 推導“大O階”的步驟: 1、用常數 1 取代運行時間中的所有加法常數。 2、在修改后的運行次數函數中,只保留最高階項。 3、如果最高階項存在且不是 1 ,則去除與這個項相乘的常數。 下面我們在通過一個有不少 for 循環的例子按照上面給出的推導“大O階”的方法來計算一下算法的時間復雜度。先看一下下面的這個例子的代碼,也是用 C 語言寫的,在注釋上我們仍然對執行次數進行說明。 int n = 100000; ? ? ? ?//執行了 1 次 for (int i = 0; i < n; i++) { ? ? ? ?//執行了 n + 1 次 for (int j = 0; j < n; j++) { ? ? ? ?//執行了 n*(n+1) 次 printf("i = %d, j = %d\n", i, j); ? ? ? ?//執行了 n*n 次 } } for (int i = 0; i < n; i++) { ? ? ? ?//執行了 n + 1 次 printf("i = %d", i); ? ? ? ?//執行了 n 次 } printf("Done"); ? ? ? ?//執行了 1 次 上面的代碼嚴格的說不能稱之為一個算法,畢竟它很“無聊而且莫名其妙”(畢竟算法是為了解決問題而設計的嘛),先不論這個“算法”能解決什么問題,我們看一下它的“大O階”如何推導,還是先計算一下它的執行總次數: 執行總次數 = 1 + (n + 1) + n*(n + 1) + n*n + (n + 1) + 1 = 2n^2 + 3n + 3 ? ?這里 n^2 表示 n 的 2次方。 按照上面推導“大O階”的步驟我們先來第一步:“用常數 1 取代運行時間中的所有加法常數”,則上面的算式變為: 執行總次數 = 2n^2 + 3n + 1 ? ?這里 n^2 表示 n 的2次方 第二步:“在修改后的運行次數函數中,只保留最高階項”。這里的最高階是 n 的二次方,所以算式變為: 執行總次數 = 2n^2 ? ?這里 n^2 表示 n 的2次方 第三步:“如果最高階項存在且不是 1 ,則去除與這個項相乘的常數”。這里 n 的二次方不是 1 所以要去除這個項的相乘常數,算式變為: 執行總次數 = n^2 ? ?這里 n^2 表示 n 的2次方 因此最后我們得到上面那段代碼的算法時間復雜度表示為: O( n^2 ) ? ? ? ?這里 n^2 表示 n 的2次方。 至此,我們對什么是“算法的時間復雜度”和“算法的時間復雜度”表示法“大O階”的推導方法進行了簡單的說明。當然要想在日后的實際工作中快速準確的推導出各種算法的“大O階”我們還需要進行大量的聯系,畢竟熟能生巧嘛。最后我們在把常見的算法時間復雜度以及他們在效率上的高低順序記錄在這里,是大家對算法的效率有個直觀的認識。 O(1) 常數階 < O(logn) 對數階 < O(n) 線性階 < O(nlogn) < O(n^2) 平方階 < O(n^3) <?{?O(2^n) < O(n!) < O(n^n)?} ? 最后三項我用大括號把他們括起來是想要告訴大家。如果日后大家設計的算法推導出的“大O階”是大括號中的這幾位,那么趁早放棄這個算法,在去研究新的算法出來吧。因為大括號中的這幾位即便是在 n 的規模比較小的情況下仍然要耗費大量的時間,算法的時間復雜度大的離譜,基本上就是“不可用狀態”。 當然了,還是要推薦一下《大話數據結構》這本書的。對于數據結構入門來說,這本書相當不錯,很“生動活潑”,讀起來也很有意思

轉載于:https://blog.51cto.com/3426724/799884

總結

以上是生活随笔為你收集整理的关于时间复杂度的全部內容,希望文章能夠幫你解決所遇到的問題。

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