時間複雜度
(1)時間頻度乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。
(2)時間複雜度在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度t(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。 一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),稱o(f(n))為演算法的漸進時間複雜度,簡稱時間複雜度。
指數時間
指的是乙個問題求解所需要的計算時間
m(n),依輸入資料的大小而呈指數成長(即輸入資料的數量依線性成長,所花的時間將會以指數成長)
for (i=1;i<=n;i++)
x++:
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
x++;
第乙個for迴圈的時間複雜度為ο(n),第二個for迴圈的時間複雜度為ο(n
2),則整個演算法的時間複雜度為ο(n+n
2)=ο(n
2)。常數時間
若對於乙個演算法,的上界與輸入大小無關,則稱其具有常數時間,記作o(1)時間。乙個例子是訪問陣列中的單個元素,因為訪問它只需要一條指令。但是,找到無序陣列中的最小元素則不是,因為這需要遍歷所有元素來找出最小值。這是一項線性時間的操作,或稱時間。但如果預先知道元素的數量並假設數量保持不變,則該操作也可被稱為具有常數時間。
對數時間
若演算法的t(n) = o(log n),則稱其具有對數時間
常見的具有對數時間的演算法有二叉樹的相關操作和二分搜尋。
對數時間的演算法是非常有效的,因為每增加乙個輸入,其所需要的額外計算時間會變小。
遞迴地將字串砍半並且輸出是這個類別函式的乙個簡單例子。它需要o(log n)的時間因為每次輸出之前我們都將字串砍半。 這意味著,如果我們想增加輸出的次數,我們需要將字串長度加倍。
線性時間
如果乙個演算法的時間複雜度為o(n),則稱這個演算法具有線性時間,或o(n)時間。非正式地說,這意味著對於足夠大的輸入,執行時間增加的大小與輸入成線性關係。例如,乙個計算列表所有元素的和的程式,需要的時間與列表的長度成正比。
01 時間複雜度 空間複雜度
1 時間頻度 乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t n n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。2 時間複雜度 若有某個輔助函式f n 使得當n趨近於無窮大時,t n f n 的極限值為不等於零的常數,則稱f n 是t n 的同數量級函式。記作t n f ...
Day2 時間複雜度演算法
複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。int cal int n return sum 總共執行了2n 2次 可以發現 所有 的執行時間 t n 與每行 的執行次數 n 成正比。t n 表示 執行的時間 n 表示資料規模的大小 f n 表示每行 執...
1 時間複雜度
演算法的計算成本涵蓋許多方面,為確定計算成本的度量標準,我們不妨從計算速度這一重要因素入手。但是這一問題並不是容易直接上手回答,原因在於,運算時間是由許多因素綜合作用而決定的。即使是同一演算法,對於不同的輸入所需的運算時間並不相同。問題規模往往是決定計算成本的主要因素。一般的,問題規模越相近,相應的...