【大o表示法】演算法的漸進時間複雜度:
一般情況下,隨著n的增大,t(n)增長最慢的演算法為最優演算法。
一、推導大o階的方法1.
用常數1取代執行時間中的所有加法常數。
2.在修改後的執行次數函式中,
只保留最高端項
。 3.如果最高端項存在且不是1,
則去除與這個項相乘的常數。得到的結果就是大o階。
二、時間複雜度的計算規則
1.常數階
程式中的基本操作按乙個操作步驟計算,如執行乙個列印語句、算術運算、邏輯運算、賦值運算、字串拼接、返回值等,每乙個操作步驟的時間複雜度為1。
例:
void fun()
注意:不管這個常數是多少,我們都記作o(1),而不能是o(3)、o(12)等其他任何數字。
例:
void fun()
事實上無論n為多少,上面的兩段**就是1次和3次執行的差異。
這種與問題的大小無關(n的多少),執行時間恆定的演算法,我們稱之為具有o(1)的時間複雜度,又叫常數階。對於分支結構而言,無論是真,還是假,執行的次數都是恆定的,不會隨著n的變大而發生變化
,所以單純的分支結構(不包含在迴圈結構中),其時間複雜度也是o(1)。
2.線性階線性階的迴圈結構會複雜很多。要確定某個演算法的階次,我們常常需要確定某個特定語句或某個語句集執行的次數。因此,我們要分析演算法的複雜度,關鍵就是要分析迴圈結構的運**況。例:
void fun(int n) }
3.對數階例:void fun(int n) }
我們一起來推導一下:2^k=n(k是迴圈的次數)
用對數表示為k = log2n,時間複雜度記為o(log2n),
常數可以忽略
,所以最後是o(logn)稱之為對數階
4.平方階例:
void fun(int n) } }
上面這個例子,對於內迴圈的時間複雜度為o(n),對於外層的迴圈,不過是內部這個時間複雜度為o(n)的語句,再迴圈n次。所以這段**的時間複雜度為o(n^2)。下面我們再來看乙個例子:void fun(int n,int m) } }
按照上面的分析,如果外迴圈的迴圈次數改為了m,時間複雜度就變為o(m×n)。所以我們得出乙個結論
:迴圈的時間複雜度等於迴圈體的複雜度乘以該迴圈執行的次數。
對於條件判斷語句,總的時間複雜度等於其中 時間複雜度最大的路徑 的時間複雜度。
void fun(int n) } } else } }
此時時間複雜度為 max(o(n^2), o(n)),即 o(n^2)。時間複雜度分析的基本策略是:從內向外分析,從最深層開始分析。如果遇到函式呼叫,要深入函式進行分析。
三、常見的時間複雜度比較如下:o(1) < o(logn) < o(n) < o(nlogn) < o(n^2) < o(n^3)o(2^n)
這個就是今天的筆記啦
以後每天學習演算法的時候,文章的末尾都會分析一下演算法的時間複雜度
演算法的時間複雜度和問題規模 演算法時間複雜度
在進行演算法分析時,語句總的執行次數 是關於問題規模 n 的函式,進而分析 隨 n 的變化情況並確定 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 它表示隨問題規模 n 的增大,演算法執行時間的增長率和 的增長率相同,稱作演算法的漸近時間複雜度,簡稱時間複雜度。其中 是問題規模 n 的...
演算法的複雜度 演算法的時間複雜度和空間複雜度
在一次筆試題目中,發現了自己對於演算法的時間複雜度問題上並沒有完全清晰這個概念和計算方法,故上網尋找到比較好的詳細介紹來學習。演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也...
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...