在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。時間複雜度記作:t(n)=o(f(n)).它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸進時間複雜度,簡稱時間複雜度。
發現官方定義極其高大上,換成大白話
演算法主要是由輸入輸出語句,三大結構語句等組成的,大部分會有迴圈(區域性性原理),隨著某乙個自變數(比如i)的值從最小值取到n,演算法所有語句總的執行次數隨著n的增大,會呈現乙個關於n的函式關係即f(n),經過大o表示法處理,得到t(n)=o(f(n));
大o表示法
用常數1取代執行時間中的所有常數項
在修改後的執行次數函式中,只保留最高端項
如果最高端項存在且不是1,則去除與這個項相乘的係數
大o表示法的由來
下面舉出三個演算法n與f(n)的關係
可以從結果看出,在判斷乙個演算法的效率時,函式中的常數和其他次要項常常可以忽略,更應該關注最高端項的階數
這四種情況基本涵蓋了演算法(程式)的時間複雜度分析的80%,二八定律嘛,咱們乙個個來看
看下面的例子
求出這個演算法的時間複雜度
答案是o(1)
解釋:f(n)是指演算法中所有語句的執行次數,便是f(n)=3,時間複雜度為o(f(n)),所以應該為o(3),可是答案為什麼是o(1)呢?
這裡就是大o表示的法第一條:用常數1取代執行時間中的所有常數項。那麼問題又來了,為什麼第一條這麼定義呢?
咱們回歸到定義:隨著某乙個自變數(比如i)的值從最小值取到n,演算法所有語句總的執行次數隨著n的增大,會呈現乙個關於n的函式關係即f(n),這裡某乙個自變數(比如i)的值從最小值取到n是指n的規模,與n的具體大小無關
int i
for(i=0;i此時時間複雜度便為o(n);
看下列**
時間複雜度答案為o(logn)
解釋:再回歸之前的定義,這裡某乙個自變數(比如i)的值從最小值取到n是指n的規模,這裡是指遍歷,從最小值依次取到n,而這裡由於count乘以2之後,就距離n更近了一些,有跳躍性,也就是說,有多少個2相乘後大於n,則會退出迴圈。
因為f(n)為總的執行次數,而這裡的執行次數便為x,所以o(f(n))=o(x)=o(logn),到這裡就有童鞋問了,
為什麼時間複雜度不是以2為底的對數?
答案:因為在對數運算中有乙個換底公式
log以c為底的2的對數,顯然是乙個常數,根據大o表示法的第三條:如果最高端項存在且不是1,則去除與這個項相乘的係數,因此時間複雜度就變為o(以c為底的n的對數),所以顯然大o表示法對數階跟底數沒有關係
int i
for(i=0;i這裡便是迴圈巢狀,兩個迴圈之間沒有什麼關係,所以時間複雜度便為o(n2);
至此時間複雜度大致的東西就總結完成了,有什麼不妥的地方,還望大家斧正!
資料結構01 時間複雜度和空間複雜度
什麼是時間複雜度?什麼是空間複雜度?遞迴斐波那契數列優化,尾遞迴優化 迴圈優化 常見時間複雜度 演算法就是計算或解決問題的步驟,用來將輸入資料轉化成輸出結果。演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演...
資料結構和演算法(二) 時間複雜度和空間複雜度
演算法效率的度量方法 事後統計方法 這種方法主要是通過設計好的測試程式和資料,利用計算機計時器對不同酸防編制的程式執行時間進行比較,從而確定演算法效率的高低。這種方法有很大的缺陷,必須依據演算法事先編制好測試程式,通常需要花費大量時間和精力,如果完了發覺測試的是糟糕的演算法,就會功虧一簣。不同測試環...
資料結構與演算法 二 時間複雜度和空間複雜度
演算法採用的策略 方案 編譯產生的 質量 問題的輸入規模 機器執行指令的速度 由此可見,拋開計算機硬體,乙個程式的執行時間依賴於演算法的好壞和輸入規模。int i,sum 0,n 100 for i 1 i n i printf d sum int i,sum 0,n 100 sum i n n 2...