时间复杂度、渐进记法、主定理
目錄
一 、 大 O 記法?
二、Ω 記法。
三、 Θ記法
四、小o記法
五、命中緩存對時(shí)間效率的影響。
六、主定理
時(shí)間復(fù)雜度反應(yīng)了一個(gè)程序的運(yùn)行時(shí)間關(guān)于實(shí)例個(gè)數(shù)變化而變化規(guī)律。在一個(gè)排序程序中,可能比較了 2n 次,但是執(zhí)行步數(shù)可能達(dá)到了 2n^3 ,就不能直接判定程序運(yùn)行時(shí)間是 n 的線性函數(shù)。兩個(gè)程序比較次數(shù)一個(gè)是3n,一個(gè)是2n 那么不能說前者的花費(fèi)的時(shí)間就要更慢些,因?yàn)樵诳偟膱?zhí)行步數(shù)上未必會(huì)比后者多。
當(dāng)實(shí)例個(gè)數(shù)足夠多的時(shí)候,計(jì)量時(shí)間的方法叫做漸進(jìn)記法,最常用的是 O(g(x)) 表示。其他常用還有 o? , Ω , Θ 記法。
一 、 大 O 記法?
當(dāng)實(shí)例個(gè)數(shù)n足夠多時(shí) ,程序執(zhí)行總步數(shù) f(n) = O(g(n)) 時(shí)滿足 :
? ?? ??
例如 當(dāng) 程序執(zhí)行步數(shù)為? f(n)= n^2+ 4log2?n? ? ?那么? f(n) = O(n^2) 成立, f(n) = O(n^3) 也成立。
二、Ω 記法。
當(dāng)實(shí)例個(gè)數(shù)n足夠多時(shí) ,程序執(zhí)行總步數(shù) f(n) = Ω(g(n)) 時(shí)滿足 :
? ?? 其中C為常數(shù)。
? ??例如 當(dāng) 程序執(zhí)行步數(shù)為? f(n)= n^2+ 4log2?n? ? ?那么? f(n) = Ω(n^2) 成立, f(n) = Ω(n) 也成立。 f(n) = Ω(n^3) 不成立
三、 Θ記法
當(dāng)實(shí)例個(gè)數(shù)n足夠多時(shí) ,程序執(zhí)行總步數(shù) f(n) = Θ(g(n)) 時(shí)滿足 :
? ?? 其中C為常數(shù)。
?例如 當(dāng) 程序執(zhí)行步數(shù)為? f(n)= n^2+ 4log2?n? ? ?那么? f(n) = Θ(n^2) 成立, f(n) = Θ(n) 不成立。 f(n) = Θ(n^3) 不成立
四、小o記法
當(dāng)實(shí)例個(gè)數(shù)n足夠多時(shí) ,程序執(zhí)行總步數(shù) f(n) = o(g(n)) 時(shí)滿足 :
當(dāng)且僅當(dāng)? ? ? f(n) =O(g(n)) 且?? f(n) 不等于 Ω (g(n)) 時(shí) 即?
?例如 當(dāng) 程序執(zhí)行步數(shù)為? f(n)= n^2+ 4log2?n? ? ?那么? f(n) = o(n^2) 不成立, f(n) = o(n) 成立。 f(n) = o(n^3) 不成立
五、命中緩存對時(shí)間效率的影響。
在簡單的計(jì)算機(jī)模型中,它的存儲(chǔ)由1級(jí)緩存,二級(jí)緩存和主存構(gòu)成。算術(shù)和邏輯操作由算術(shù)和邏輯單元 (ALU) 對存儲(chǔ)在寄存器R中的數(shù)據(jù)進(jìn)行處理來完成。通常主存的大小時(shí)幾百M(fèi)B,二級(jí)緩存大小不足1MB,1級(jí)緩存的大小是幾十KB,寄存器的數(shù)量在8到32之間。容量越小的,讀取效率越高。
程序在運(yùn)行時(shí),所有數(shù)據(jù)都在主存,當(dāng)要讀取數(shù)據(jù)時(shí),程序會(huì)率先在1級(jí)緩存中去找,如果沒有再去二級(jí)緩存去找,之后再去主存中去找,在緩存中讀取的需要數(shù)據(jù)比起在主存中讀取需要的數(shù)據(jù)效率來得高。如果在主存中找到需要的數(shù)據(jù),會(huì)把它復(fù)制到在二級(jí)緩存,一級(jí)緩存和寄存器中,再進(jìn)行操作。
因?yàn)榫彺娴拇嬖?#xff0c;時(shí)程序相同執(zhí)行步數(shù)的情況下,耗時(shí)也可能會(huì)大有不同。
例如有二維數(shù)組即矩陣的乘法運(yùn)算
//程序1 i j k 的遍歷方式 void multiplyMartix(int **a , int ** b ,int **c,int n){//初始化矩陣c 的值為 0 initial(c,0);for (int i =0 ; i< n ;i++)for (int j =0 ; j< n ;k++)for (int k =0 ; k< n ;k++)c[i][j] += a[i][k] * b[k][j]; }//效率的更高的程序二 i k j 的遍歷方式 void multiplyMartix(int **a , int ** b ,int **c,int n){//初始化矩陣c 的值為 0 initial(c,0);for (int i =0 ; i< n ;i++)for (int k =0 ; k< n ;k++)for (int j =0 ; j< n ;k++)c[i][j] += a[i][k] * b[k][j]; }由與第二個(gè)程序,再1次內(nèi)部第3層循環(huán)中,每一次循環(huán)讀的 a[i][k] 的臨時(shí)變量都是同一個(gè),所以緩存命中次數(shù)要比第1個(gè)程序占比來得高,效率更快。
六、主定理
?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的时间复杂度、渐进记法、主定理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内部排序选择、冒泡、插入、希尔、快速、归
- 下一篇: C++ : 矩阵初等行变换,化成最简矩阵