程式猿可以讓步,卻不可以退縮,可以羞澀,卻不可以軟弱,總之,程式設計師必須是勇敢的。
時間複雜度序言
當前兩天我寫完《大話資料結構》的序言的時候,我就在想,我該如何把從大話資料結構中對應用開發人員有用的知識提煉出來?我是該如同課本一樣把所有的知識羅列個遍?還是如何如何,我想如果我把所有的東西都羅列出來,那還不如讓廣大的讀者去自己看這本書呢,畢竟我這小渣渣的層次面還跟不上程杰大神呢,幽默度更不用說了,所以我想了幾天 決定把對開發人員有用的整理出來,其實也是為了自己以後能夠快速地找到我想要的知識點.利人利己的事情,何樂而不為呢?
時間複雜度的概念以及實際作用
電腦科學中,演算法的***時間複雜度***是乙個函式,它定量描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串的長度的函式。時間複雜度常用大o符號表述,不包括這個函式的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,它考察當輸入值大小趨近無窮時的情況。
說白了,就是對函式或者方法的複雜程度的度量.那麼我們什麼時候使用這個時間複雜度呢?在實際中,我們或多或少都要寫一些方法或者函式,但是如果函式的時間複雜度過大,就會影響到整個專案或者工程的執行,耗損不必要的記憶體空間,影響使用者的體驗效果,一旦使用者的體驗效果不好,那麼就是老一套了,該需求,改需求再改需求…但是我們需要改動那一些函式或者方法呢?這就需要到我們的"時間複雜度"相關的知識了.(當然了,空間複雜度也是需要的,但是我還沒看到那,所以,見諒~)
演算法時間複雜度的定義
定義:在進行演算法分析時候,語句總的執行次數t(n)是關於問題規模n的函式,進而分型t(n)隨著n的變化情況並確定t(n)的數量級.演算法的時間複雜度,也就是演算法的時間度量記作:t(n)=o(f(n)).它表示隨著問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸近時間複雜度,簡稱時間複雜度.其中f(n)是問題規模n的某個函式.
這裡用大寫的o( )來體現演算法時間複雜度的記法,我們稱之為大o記法.
分析乙個函式或者演算法的時間複雜度
分析乙個函式或者演算法的時間複雜度,其實就是推導大o階
推導大o階:正如書中所講的一樣,這就是遊戲攻略,我們拿著這個遊戲攻略開始戰鬥吧.1.用常熟1取代執行時間中的所有加法常數.
2.在修改後的執行次數函式中,只保留最高端項.
3.如果最高端項存在且不是1,則去除與這個像相乘的常數.
得到的結果就是大o階.
比較常見的大o階分析
順序結構
//順序結構
int sum =0, n= 100;//執行一次
sum = (1+n)/2;//執行一次
nslog(@"%d",sum);//執行一次
分支結構
//分支結構
//整個分支結構不管條件如何都只執行一次
if (/* disables code */ (1) != 2) else
for迴圈結構
for (int i = 0; i< n; i++)
while迴圈結構
int count = 1;
while (count < n)
實際應用中肯定不能像上面那麼只有單個結構,可能有兩種或者兩種以上的結構,下面看一下兩個for迴圈巢狀的時間複雜度又是如何呢? 我們先看乙個特殊的巢狀,下面的這個巢狀是兩層都進行n次迴圈,那麼總的執行次數函式就是 f(n) = n^2;接著再根據我們的遊戲攻略一頓計算,知道我們的時間複雜度是 o(n^2 );
兩層都執行n次的for迴圈
for (int i = 0; i< n; i++)
}
如果是下面的這種呢?外層迴圈n次,內層迴圈m次,我們又該如何求解複雜度呢?其實跟上面是大同小異的,我們只需要把上面的其中乙個n換成m就好了,所以時間複雜度為o(m*n );
for (int i = 0; i< n; i++)
}
那麼,再看一下下面的這個巢狀,我們分析一下它總共執行幾次,由於當i = 0時,內迴圈執行n此,當n = 1時, 執行了 n - 1 次, …當 i = n-1 時, 執行了1次,所以總的執行次數為:
n + (n -1) +( n -2 ) +… +1 = n(n +1)/2 = n^2/2 + n/2
根據我們的遊戲秘籍的三部曲,我們可以分析出來,時間複雜度為 o( n^2 );
for (int i = 0; i< n; i++)
}
for (int i = 0; i< n; i++)
}
-(void)function
常見的時間複雜度
我就直接上圖了,主要是比較集中常見的時間複雜度的大小.
資料結構之時間複雜度和空間複雜度
演算法複雜度分為時間複雜度和空間複雜度,乙個好的演算法應該具體執行時間短,所需空間少的特點。隨著計算機硬體和軟體的提公升,乙個演算法的執行時間是算不太精確的。只能依據統計方法對演算法進行估算。我們拋開硬體和軟體的因素,演算法的好壞直接影響程式的執行時間。我們看一下小例子 int value 0 執行...
資料結構之時間複雜度和空間複雜度
準備系統性的記錄一下資料結構與演算法的知識點,今天就先從時間複雜度與空間複雜度開始咯 時間複雜度的定義 在電腦科學中,演算法的時間複雜度是乙個函式,它定量描述了該演算法的執行時間。乙個演算法執行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程式放在機器上跑起來,才能知道。並且在測試過程中還需...
資料結構時間複雜度 資料結構之時間複雜度分析
正文 開篇我們先思考這麼乙個問題 一台老式的 cpu 的計算機執行 o n 的程式,和一台速度提高的新式 cpu 的計算機運 o n2 的程式。誰的程執行效率高呢?答案是前者優於後者。為什麼呢?我們從時間複雜度分析就可以知道。1 什麼是時間複雜度?在進行演算法分析時,語句總的執行次數 t n 是關於...