最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

數(shù)據(jù)結(jié)構(gòu):十分鐘搞定時間復雜度(算法的時間復雜度)

2022-04-25 19:05 作者:C語言編程__Plus  | 我要投稿

我們假設計算機運行一行基礎代碼需要執(zhí)行一次運算。


那么上面這個方法需要執(zhí)行 2 次運算


這個方法需要 (n + 1 + n? + 1) = 2n + 2 次運算。

我們把 算法需要執(zhí)行的運算次數(shù) 用 輸入大小n 的函數(shù) 表示,即 T(n) 。

此時為了 估算算法需要的運行時間 和 簡化算法分析,我們引入時間復雜度的概念。

定義:存在常數(shù) c 和函數(shù) f(N),使得當 N >= c 時 T(N) <= f(N),表示為 T(n) = O(f(n)) 。

如圖:

當 N >= 2 的時候,f(n) = n^2 總是大于 T(n) = n + 2 的,于是我們說 f(n) 的增長速度是大于或者等于 T(n) 的,也說 f(n) 是 T(n) 的上界,可以表示為 T(n) = O(f(n))。

因為f(n) 的增長速度是大于或者等于 T(n) 的,即T(n) = O(f(n)),所以我們可以用 f(n) 的增長速度來度量 T(n) 的增長速度,所以我們說這個算法的時間復雜度是 O(f(n))。

算法的時間復雜度,用來度量算法的運行時間,記作: T(n) = O(f(n))。它表示隨著 輸入大小n 的增大,算法執(zhí)行需要的時間的增長速度可以用 f(n) 來描述。

顯然如果 T(n) = n^2,那么 T(n) = O(n^2),T(n) = O(n^3),T(n) = O(n^4) 都是成立的,但是因為第一個 f(n) 的增長速度與 T(n) 是最接近的,所以第一個是最好的選擇,所以我們說這個算法的復雜度是 O(n^2) 。

那么當我們拿到算法的執(zhí)行次數(shù)函數(shù) T(n) 之后怎么得到算法的時間復雜度呢?

1、我們知道常數(shù)項對函數(shù)的增長速度影響并不大,所以當 T(n) = c,c 為一個常數(shù)的時候,我們說這個算法的時間復雜度為 O(1);如果 T(n) 不等于一個常數(shù)項時,直接將常數(shù)項省略。


2、我們知道高次項對于函數(shù)的增長速度的影響是最大的。n^3 的增長速度是遠超 n^2 的,同時 n^2 的增長速度是遠超 n 的。 同時因為要求的精度不高,所以我們直接忽略低此項。


3、因為函數(shù)的階數(shù)對函數(shù)的增長速度的影響是最顯著的,所以我們忽略與最高階相乘的常數(shù)。


綜合起來:如果一個算法的執(zhí)行次數(shù)是 T(n),那么只保留最高次項,同時忽略最高項的系數(shù)后得到函數(shù) f(n),此時算法的時間復雜度就是 O(f(n))。為了方便描述,下文稱此為 大O推導法。

由此可見,由執(zhí)行次數(shù) T(n) 得到時間復雜度并不困難,很多時候困難的是從算法通過分析和數(shù)學運算得到 T(n)。對此,提供下列四個便利的法則,這些法則都是可以簡單推導出來的,總結(jié)出來以便提高效率。

1、對于一個循環(huán),假設循環(huán)體的時間復雜度為 O(n),循環(huán)次數(shù)為 m,則這個

循環(huán)的時間復雜度為 O(n×m)。


此時時間復雜度為 O(n × 1),即 O(n)。

2、對于多個循環(huán),假設循環(huán)體的時間復雜度為 O(n),各個循環(huán)的循環(huán)次數(shù)分別是a, b, c...,則這個循環(huán)的時間復雜度為 O(n×a×b×c...)。分析的時候應該由里向外分析這些循環(huán)。


此時時間復雜度為 O(n × n × 1),即 O(n^2)。

3、對于順序執(zhí)行的語句或者算法,總的時間復雜度等于其中最大的時間復雜度。


此時時間復雜度為 max(O(n^2), O(n)),即 O(n^2)。

4、對于條件判斷語句,總的時間復雜度等于其中 時間復雜度最大的路徑 的時間復雜度。


此時時間復雜度為 max(O(n^2), O(n)),即 O(n^2)。

時間復雜度分析的基本策略是:從內(nèi)向外分析,從最深層開始分析。如果遇到函數(shù)調(diào)用,要深入函數(shù)進行分析。

最后,我們來練習一下

一. 基礎題

求該方法的時間復雜度


參考答案:

當 i = 0 時,內(nèi)循環(huán)執(zhí)行 n 次運算,當 i = 1 時,內(nèi)循環(huán)執(zhí)行 n - 1 次運算……當 i = n - 1 時,內(nèi)循環(huán)執(zhí)行 1 次運算。

所以,執(zhí)行次數(shù) T(n) = n + (n - 1) + (n - 2)……+ 1 = n(n + 1) / 2 = n^2 / 2 + n / 2。

根據(jù)上文說的 大O推導法 可以知道,此時時間復雜度為 O(n^2)。

二. 進階題

求該方法的時間復雜度


參考答案:

假設循環(huán)次數(shù)為 t,則循環(huán)條件滿足 2^t < n。

可以得出,執(zhí)行次數(shù)t = log(2)(n),即 T(n) = log(2)(n),可見時間復雜度為 O(log(2)(n)),即 O(log n)。

三. 再次進階

求該方法的時間復雜度


參考答案:

顯然運行次數(shù),T(0) = T(1) = 1,同時 T(n) = T(n - 1) + T(n - 2) + 1,這里的 1 是其中的加法算一次執(zhí)行。

顯然 T(n) = T(n - 1) + T(n - 2) 是一個斐波那契數(shù)列,通過歸納證明法可以證明,當 n >= 1 時 T(n) < (5/3)^n,同時當 n > 4 時 T(n) >= (3/2)^n。

所以該方法的時間復雜度可以表示為 O((5/3)^n),簡化后為 O(2^n)。

可見這個方法所需的運行時間是以指數(shù)的速度增長的。如果大家感興趣,可以試下分別用 1,10,100 的輸入大小來測試下算法的運行時間,相信大家會感受到時間復雜度的無窮魅力。

作者:raymondCaptain;鏈接:https://www.jianshu.com/p/f4cca5ce055a

寫在最后:另外,對于準備學習C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!

微信公眾號:C語言編程學習基地

C語言零基礎入門教程(83集全)

整理分享(多年學習的源碼、項目實戰(zhàn)視頻、項目筆記,基礎入門教程)

歡迎轉(zhuǎn)行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!

編程學習書籍分享:

粉絲編程交流:


數(shù)據(jù)結(jié)構(gòu):十分鐘搞定時間復雜度(算法的時間復雜度)的評論 (共 條)

分享到微博請遵守國家法律
邵阳市| 广水市| 北票市| 嘉义市| 寿光市| 东乡县| 榆中县| 建阳市| 保德县| 渑池县| 昂仁县| 尼木县| 梨树县| 霍州市| 德化县| 中宁县| 永善县| 新营市| 伽师县| 镇宁| 谢通门县| 惠安县| 澜沧| 江口县| 光山县| 东兰县| 麻城市| 庆元县| 安龙县| 宁国市| 邳州市| 桂东县| 曲阳县| 永州市| 乌拉特后旗| 武隆县| 鄄城县| 阿勒泰市| 内乡县| 肃南| 教育|