1、什麼是複雜度:
複雜度分為:時間複雜度(漸進時間複雜度)與空間複雜度(漸進空間複雜度)。
時間複雜度:表示演算法的執行時間隨資料規模增長的變化趨勢。
空間複雜度:表示演算法的儲存空間與資料規模之間的增長關係。
2、為什麼要知道複雜度
①。事後統計法:跑一邊**就能得到執行時間和占用記憶體大小。
②。測試環境與資料規模會影響測試結果。
③。在不同配置的計算機下測試,得到的測試結果往往不同。
在資料規模不大的情況下,插入排序比快速排序快,如果是一組有序的資料,**執行的時間很短。
④。所以在這種情況下,我們往往不需要資料規模,可以粗略地估算出演算法的執行效率。
3、時間複雜度分析:
int plus(int n)
return sum;
}
假設處理器執行每段**的時間相同,設為t,三四兩行執行2t,5,7行都執行了n次,所以**總的執行時間為(2n+2)*t;可以看出來,所有**的執行時間 t(n) 與每行**的執行次數成正比。
int plus(int n)
}}
我們還是假設每段**執行的時間為t,3,4,5執行1次,6,8執行n次,9,11執行n* n次,所以**的執行總時間為:(2n*n+2n+3)*t。
用大o表示法表示:t(n) = o(f(n)).
大 o 時間複雜度表示法。大 o 時間複雜度實際上並不具體表示**真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢。
所以可以想象當n無窮大的時候,常量,低階和係數並無會影響執行時間的增長趨勢,所以,上述兩個複雜度可以表示為:o(n);o(n²);
①:我們在分析乙個演算法、一段**的時間複雜度的時候,也只關注迴圈執行次數最多的那一段**就可以了。
②:總複雜度等於量級最大的那段**的複雜度
③:巢狀**的複雜度等於巢狀內外**複雜度的乘積
4、常見的時間複雜度:
從低階到高階有:o(1)、o(logn)、o(n)、o(nlogn)、o(n² )。
越高階複雜度的演算法,效率就越低。
o(logn):
i=1;
while (i <= n)
i是取值:2,4,8,16…所以迴圈次數為o(log2n)。
如果換成i= i*3; 複雜度就變成了o(log3n)。
在對數階時間複雜度的表示方法裡,我們忽略對數的「底」,統一表示為 o(logn)。
5、空間複雜度:
void print(int n)
}
跟上面的分析一樣,所以整段**的空間複雜度就是 o(n)。 資料結構與演算法2 時間複雜度和空間複雜度
演算法效率的度量方法 事後統計的方法 事前分析估算方法。演算法的時間複雜度 在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度記作 t n o f n 它表示隨問題規模n的增大,演算法執行時間的增長率和f n ...
資料結構與演算法 二 時間複雜度和空間複雜度
演算法採用的策略 方案 編譯產生的 質量 問題的輸入規模 機器執行指令的速度 由此可見,拋開計算機硬體,乙個程式的執行時間依賴於演算法的好壞和輸入規模。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...
資料結構與演算法(二) 時間複雜度和空間複雜度
演算法採用的策略,方案 編譯產生的 質量 問題的輸入規模 機器執行指令的速度 由此可見,拋開這些與計算機硬體 軟體有關的因素,乙個程式的執行時間依賴於演算法的好壞和問題的輸入規模 我們研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增長量的乙個抽象,而不是精確的定位需要執行多少次 我們不關心語...