数据结构(01)— 算法复杂度概念及常见的复杂度计算
1. 大 O 表示法
大 O 表示法指出了算法有多快,讓你能夠比較操作數,它指出了算法運行時間的增速,而并非以秒為單位的速度。大 O 表示法指出了最糟情況下的運行時間。大 O 表示法在討論運行時間時,log 指的都是 log2。
2. 復雜度概念
復雜度是一個關于輸入數據量 n 的函數。假設你的代碼復雜度是 f(n),那么就用個大寫字母 O 和括號,把 f(n) 括起來就可以了,即 O(f(n))。例如,O(n) 表示的是,復雜度與計算實例的個數 n 線性相關;O(logn) 表示的是,復雜度與計算實例的個數 n 對數相關。
?
通常,復雜度的計算方法遵循以下幾個原則:
- 復雜度與具體的常系數無關;
例如 O(n) 和 O(2n) 表示的是同樣的復雜度。我們詳細分析下,O(2n) 等于 O(n+n),也等于 O(n) + O(n)。也就是說,一段 O(2n) 復雜度的代碼只是先后執行兩遍 O(n),其復雜度是一致的。
- 多項式級的復雜度相加的時候,選擇高者作為結果;
例如 O(n2)+O(n) 和 O(n2) 表示的是同樣的復雜度。具體分析一下就是,O(n2)+O(n) = O(n2+n)。隨著 n 越來越大,二階多項式的變化率是要比一階多項式更大的。因此,只需要通過更大變化率的二階多項式來表征復雜度就可以了。
- ?
O(1)也是表示一個特殊復雜度,含義為某個任務通過有限可數的資源即可完成。此處有限可數的具體意義是,與輸入數據量n無關。
例如,你的代碼處理 10 條數據需要消耗 5 個單位的時間資源,3 個單位的空間資源。處理 1000 條數據,還是只需要消耗 5 個單位的時間資源,3 個單位的空間資源。那么就能發現資源消耗與輸入數據量無關,就是 O(1) 的復雜度。
?
3. 常見復雜度
常見的復雜度結論:
- 一個順序結構的代碼,時間復雜度是
O(1); - 二分查找,或者更通用地說是采用分而治之的二分策略,時間復雜度都是
O(logn); - 一個簡單的
for循環,時間復雜度是O(n); - 兩個順序執行的
for循環,時間復雜度是O(n)+O(n)=O(2n),其實也是O(n); - 兩個嵌套的
for循環,時間復雜度是O(n2);
?
下面按從快到慢的順序列出了經常會遇到的 5 種時間復雜度:
O(log n),也叫對數時間,這樣的算法包括二分查找;O(n),也叫線性時間,這樣的算法包括簡單查找;O(n*logn),這樣的算法包括快速排序 —— 一種速度較快的排序算法;O(n2),這樣的算法包括選擇排序 —— 一種速度較慢的排序算法;O(n!),這樣的算法包括旅行商問題的解決方案 —— 一種非常慢的算法;
3.1 O(1)
比如操作一步到位這是常數級別的時間復雜,即為 O(1)。
a = 100 / 2 + 101 * 10 + 5
3.2 O(logn)
如下操作,每次 n 會被除以 3,遍歷次數等于以 3 為底 logn 次。在大 O 標記體系中,以 3 為底和以 5 為底沒有區別,所以統一標記為 O(logn)。
def f(n):while n > 0:print(n)n /= 3
3.3 o(n)
線型復雜度也是很理想的情況,如下面的操作,每次遍歷,n 減去 3,這樣總共遍歷 (n-1)/3 + 1 次后算法終止,根據大 O 標記法,算法的時間復雜為 O(n)。
def f(n):while n > 0:print(n)n -= 3
3.4 O(nlogn)
如下面所示的兩層循環,復雜度便是 nlogn。外層循環的運行次數為 n,里層循環的運行次數為 logn 次,所以一共需要 nlogn 次。
def f(n):for i in range(n):n /= 2for j in range(1,n):print(i*j)
3.5 O(n^2)
O(n^2) 是多項式時間復雜度的代表,此類算法的時間復雜度已經難以劃分到高效算法集合中,它只能是問題的有效解,而不是高效解。如下兩層for 循環,時間復雜度就是 O(n^2)。
def f(n):for i in range(n):for j in range(n):print(i*j)
3.6 O(2^n)
時間復雜度為 O(2^n) 的算法是指數級增長的,此類復雜度下求解的問題往往都是難題,因為隨著問題規模 n的增長,指數級的增長速度是驚人的。
例如經典的旅行商問題,商人要去 n個地方拜訪,如何規劃拜訪順序才能使得旅行距離最短。如果僅拜訪肉眼可見的兩三個地方時,我們還能窮舉所有拜訪的組合,進而找到最短路徑。
但是當問題規模 n 變大時,目前所有的計算機資源總和都難以在有限的時間里計算出最優的最短路徑,這類問題的時間復雜度都為指數級,屬于 NP 難問題。
總結
以上是生活随笔為你收集整理的数据结构(01)— 算法复杂度概念及常见的复杂度计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国再生橡胶制造行业
- 下一篇: 2022-2028年中国软件测试行业市场