如何衡量乙個演算法的好壞,演算法的好壞分析分為兩種:時間效率和空間效率.時間效率被稱為時間複雜度,空間效率被稱為空間複雜度,由於計算機的快速發展,計算機的儲存容量已經達到了很高的程度,所以現今已經不需要特別關注乙個演算法的空間複雜度.
概念
演算法中的基本操作的執行次數,為演算法的時間複雜度.
時間複雜度卻用操作執行的次數作為評判標準,這是因為在不同配置的機器上同一演算法的執行時間是不同的,這樣沒法去比較演算法的效率,所以使用操作的執行次數作為評判標準,不管是在什麼機器上,同一演算法的執行次數也肯定是相同的
o()漸進表示法
舉個例子
void
func
(int n)
}for
(int k =
0; k < n;
++k)
for(
int l =
0; l <10;
++l)
printf
("%d\n"
, count)
;}
上面的函式 ++count 操作的執行次數的數學表示式為:
f(n) = n^2 + 2*n + 10
隨著 n 的增大,表示式的低次冪項和常數項對結果的影響也越來越小,所以我們只需要大概的執行次數,也就是漸進表示法.
方法:用常數1取代執行時間中的所有加法常數
在修改後的執行次數函式中,只保留最高端項
如果最高端項存在係數且不是1,則去除與這個相熟相乘的常數.得到的結 結果就是o()
使用大o的漸進表示法後,上面的函式時間複雜度為:
o(n^2)
有些演算法每次執行的次數也可能不相同,在實際中一般是關注演算法的最壞運**況.就比如天氣預報說明天會有8 ~ 12級大風,你肯定會按12級風來做好防範.
常見的時間複雜度
o(1)
o(n)
o(logn)
o(n*logn))
o(n^2)
o(2^n)
空間複雜度是衡量乙個演算法在執行過程中臨時占用儲存空間大小的度量
空間複雜度的計算規則和時間複雜度類似,也是用大o漸進表示法
例如
void
bubblesort
(int
*a,int n)}if
(flag ==0)
}}
上面是乙個氣泡排序的演算法,演算法使用的臨時空間包括形參,迴圈次數和乙個 flag 之外便沒有其他的臨時空間了,並且這幾個變數並不隨著 n 的改變而改變,所以這 5 個變數所佔的空間大小是乙個常量,那麼它的空間複雜度就是
o(1)
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...