1. 程式人生 > >什麽是時間復雜度

什麽是時間復雜度

是你 logs 而且 一半 等於 元素 引入 所有 避免

什麽是時間復雜度

作為一個處在學習之路的渣渣,被一個時間復雜度的題給難倒了,然後我就思考了一下什麽是時間復雜度。雖然在學校學習了了算法的課程,但是仔細一想,對於時間復雜度還真是不怎麽懂。於是重新學習,記下自己的一些理解。

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;i<n;i++)

sum++;

上面代碼中第一行頻度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(n2)(n的k次方的情況)最常見的就是平時的對數組進行排序的各種簡單算法都是O(n2),例如直接插入排序的算法。

而像矩陣相乘算法運算則是O(n3)。

舉個簡單栗子:

sum=0;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

sum++;

第一行頻度1,第二行n,第三行n2,第四行n2,T(n)=2n2+n+1 =O(n2)

O(2的n次方) 比如求具有n個元素集合的所有子集的算法

O(n!) 比如求具有N個元素的全排列的算法

時間復雜度按n越大算法越復雜來排的話:常數階O(1)、對數階O(logn)、線性階O(n)、線性對數階O(nlogn)、平方階O(n2)、立方階O(n3)、……k次方階O(n的k次方)、指數階O(2的n次方)。

既然說到了這個復雜排序,就必須再多說幾句。我們還需要區分算法最壞情況的行為和期望行為。就比如說快速排序,最壞情況運行時間是 O(n2),但期望時間是O(nlogn)。但是我們只要通過一些手段,可以避免最壞情況發生,所以在實際情況中,精心設計的快速排序都能以期望時間運行。

最後再提一下指數的情況。指數算法一般來說太復雜了,所以實際情況下如果不是迫不得已不要用時間復雜度為指數的算法,除非n特別小。

啰啰嗦嗦寫了很多最基礎的東西,也是想加深一下印象,如果有錯誤還請指出。

原文地址 https://www.cnblogs.com/huangbw/p/7398418.html

什麽是時間復雜度