數據結構與算法學習筆記(二)
數據結構與算法中,最重要和基礎的概念莫過於複雜度分析。複雜度分析從時間和空間維度可以分爲時間複雜度分析和空間複雜度分析。平常用的最多的就是時間複雜度分析。
爲什麼要進行複雜度分析
- 測試結果依賴測試環境
因爲現實中不同配置的機器,對於同樣規模數據的測試結果不同,在實際結果出來前,需要對程序大致執行的時間以及空間消耗有一個大致的掌握。 - 測試結果受數據規模的影響
不同的數據規模對測試的影響也不一樣,小數據樣本可能算法的開銷成本在不同機器上體現不明顯,但當數據成幾何倍數增加的時候,我們需要知道算法執行效率的高低,以便設計更有效的算法和數據結果去應對不同的結果。
大O複雜度表示法
表示數據規模,表示執行時間,表示每行代碼執行的次數總和。表示與成正比的關係。
注意:大O時間複雜度表示法並不表示代碼的具體運行時間,而是代碼執行時間隨數據規模增長的變化趨勢,也叫漸進時間複雜度(asymptotic time complexity)。當數據規模很大時,常量,低階,係數等部分並不左右增長趨勢,在計算時間複雜度的時候可以忽略,只需要記錄對數據影響最大的那一個部分。
時間複雜度分析方法
典型的時間複雜度分析方法有以下四種方法,總結如下:
- 只關注循環執行次數最多的一段代碼
- 加法法則:總複雜度等於量級最大的那段代碼的複雜度
- 乘法法則:嵌套代碼的時間複雜度等於嵌套內外代碼複雜度的乘積
- 多個規模的不同代碼段,求其加法
複雜度量級
主要的複雜度量級有以下7種:
- 常量階:O(1)
- 指數階:O()
- 對數階:O()
- 階乘階:O()
- 線性階:O()
- 線性對數階: O()
- 平方階,立方階
其中,指數階和階乘階,隨着數據規模的增大,算法的時間開銷急劇增加,將這種時間複雜度爲非多項式量級的算法稱爲NP(None-Deterministic Polynomial) 問題。