什麼是時間複雜度
作為乙個處在學習之路的渣渣,被乙個時間複雜度的題給難倒了,然後我就思考了一下什麼是時間複雜度。雖然在學校學習了了演算法的課程,但是仔細一想,對於時間複雜度還真是不怎麼懂。於是重新學習,記下自己的一些理解。
1.時間複雜度
提到時間複雜度,第一時間想到的是演算法,簡單說,演算法就是你解決問題的方法,而你用這個方法解決這個問題所執行的語句次數,稱為語句頻度或者時間頻度,記為t(n)。
那麼問題來了,我們為什麼要引入這些個概念呢。因為我們想要的是執行乙個演算法耗費的時間,這個時間理論上可以得到,但是,要得到這個時間就必須要上機測試,但是有這個必要嗎?我們需要知道的是哪乙個演算法需要的時間多,哪乙個演算法需要的時間少,這樣就可以了。而且,演算法的耗時和語句的執行次數是成正比的,即語句執行越多,耗時越多。這也就是我們引入概念的原因。
在上面提到的時間頻度t(n)中,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)) 為演算法的漸進時間複雜度,簡稱時間複雜度。通俗一點講,其實所謂的時間複雜度,就是找了乙個同樣曲線型別的函式f(n)來表示這個演算法的在n不斷變大時的趨勢 。當輸入量n逐漸加大時,時間複雜性的極限情形稱為演算法的「漸近時間複雜性」。
我們用大o表示法表示時間複雜性,它是乙個演算法的時間複雜性。大o表示只是說有上界但並不是上確界。
「大o記法」:在這種描述中使用的基本引數是 n,即問題例項的規模,把複雜性或執行時間表達為n的函式。這裡的「o」表示量級 (order),比如說「二分檢索是 o(logn)的」,也就是說它需要「通過logn量級的步驟去檢索乙個規模為n的陣列」記法 o ( f(n) )表示當 n增大時,執行時間至多將以正比於 f(n)的速度增長。
時間複雜度對於演算法進行的分析和大致的比較非常有用,但是真正的情況可能會因為一些其他因素造成差異。比如乙個低附加代價的o(n2)演算法在n較小的情況下可能比乙個高附加代價的 o(nlogn)演算法執行得更快。但是,n越來越大以後,相比較而言較慢上公升函式的演算法會執行的更快。
上面我引用了一些專業的定義,可能並不是太好理解,下面會寫一些常出現的演算法時間複雜度和一些例項來解釋一下。
2.簡單演算法的時間複雜度舉例
列舉一些簡單例子的時間複雜度。
o(1)的演算法是一些運算次數為常數的演算法。例如:
temp=a;a=b;b=temp;
上面語句共三條操作,單條操作的頻度為1,即使他有成千上萬條操作,也只是個較大常數,這一類的時間複雜度為o(1)。
o(n)的演算法是一些線性演算法。例如:
sum=0;
for(i=0;isum++;
上面**中第一行頻度1,第二行頻度為n,第三行頻度為n,所以f(n)=n+n+1=2n+1。所以時間複雜度o(n)。這一類演算法中操作次數和n正比線性增長。
o(logn) 乙個演算法如果能在每個步驟去掉一半資料元素,如二分檢索,通常它就取 o(logn)時間。舉個栗子:
int i=1;
while (i<=n)
i=i*2;
上面**設第三行的頻度是f(n), 則:2的f(n)次方<=n;f(n)<=log₂n,取最大值f(n)= log₂n,所以t(n)=o(log₂n ) 。
o(n²)(n的k次方的情況)最常見的就是平時的對陣列進行排序的各種簡單演算法都是o(n²),例如直接插入排序的演算法。
而像矩陣相乘演算法運算則是o(n³)。
舉個簡單栗子:
sum=0;
for(i=0;ifor(j=0;jsum++;
第一行頻度1,第二行n,第三行n²,第四行n²,t(n)=2n²+n+1 =o(n²)
o(2的n次方) 比如求具有n個元素集合的所有子集的演算法
o(n!) 比如求具有n個元素的全排列的演算法
時間複雜度按n越大演算法越複雜來排的話:常數階o(1)、對數階o(logn)、線性階o(n)、線性對數階o(nlogn)、平方階o(n²)、立方階o(n³)、……k次方階o(n的k次方)、指數階o(2的n次方)。
既然說到了這個複雜排序,就必須再多說幾句。我們還需要區分演算法最壞情況的行為和期望行為。就比如說快速排序,最壞情況執行時間是 o(n²),但期望時間是o(nlogn)。但是我們只要通過一些手段,可以避免最壞情況發生,所以在實際情況中,精心設計的快速排序都能以期望時間執行。
最後再提一下指數的情況。指數演算法一般來說太複雜了,所以實際情況下如果不是迫不得已不要用時間複雜度為指數的演算法,除非n特別小。
囉囉嗦嗦寫了很多最基礎的東西,也是想加深一下印象,如果有錯誤還請指出。
dfs時間複雜度 時間複雜度 空間複雜度
時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...
時間複雜度 空間複雜度
演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...