天天看點

算法時間複雜度 和 空間複雜度時間複雜度 空間複雜度

 算法複雜度分為時間複雜度和空間複雜度,一個好的算法應該具體執行時間短,所需空間少的特點。

     随着計算機硬體和軟體的提升,一個算法的執行時間是算不太精确的。隻能依據統計方法對算法進行估算。我們抛開硬體和軟體的因素,算法的好壞直接影響程式的運作時間。

     我們看一下小例子:

     int value = 0;                         // 執行了1次

     for (int i = 0; i < n; i++) {       // 執行了n次

          value += i;

     }

     這個算法執行了 1 + n 次,如果n無限大,我們可以把前邊的1忽略,也就是說這個算法執行了n次

     時間複雜度常用大o符号表示,這個算法的時間複雜度就是o(n).

     概念: 一般情況下,算法的基本操作重複執行的次數是子產品n的某一函數f(n),是以,算法的時間複雜度記做 t(n) = o(f(n))。 随着子產品n的增大,算法執行的時間增長率f(n)的增長率成正比,是以f(n)越小,算法 的時間複雜度越低,算法的效率越高。

     計算時間複雜度

     1.去掉運作時間中的所有加法常數。

     2.隻保留最高階項。

     3.如果最高階項存在且不是1,去掉與這個最高階相乘的常數得到時間複雜度

我們看一個例子

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

          for (int j = i; j < n; j++) {

               // do .....

          }

當 i = 0 時 裡面的fo循環執行了n次,當i等待1時裡面的for循環執行了n -  1次,當i 等于2裡裡面的fro執行了n - 2次........是以執行的次數是

算法時間複雜度 和 空間複雜度時間複雜度 空間複雜度

根據我們上邊的時間複雜度算法

     1.去掉運作時間中的所有加法常數: 沒有加法常數不用考慮

     2.隻保留最高階項: 隻保留 

算法時間複雜度 和 空間複雜度時間複雜度 空間複雜度

     3. 去掉與這個最高階相乘的常數:  去掉

算法時間複雜度 和 空間複雜度時間複雜度 空間複雜度

  隻剩下 

算法時間複雜度 和 空間複雜度時間複雜度 空間複雜度

     最終這個算法的時間複雜度為

算法時間複雜度 和 空間複雜度時間複雜度 空間複雜度

再看一個線性的

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

          // do .....

     因為循環要執行n次是以時間複雜度為o(n)

其它的我也就不一個一個算了,下面給出了常用的時間複雜度

排序法

最差時間分析

平均時間複雜度

穩定度

空間複雜度

冒泡排序

o(n2)

穩定

o(1)

快速排序

o(n*log2n)

不穩定

o(log2n)~o(n)

選擇排序

二叉樹排序

不一頂

o(n)

插入排序

堆排序

希爾排序

o

類似于時間複雜度的讨論,一個算法的空間複雜度(space complexity)s(n)定義為該算法所耗費的存儲空間,它也是問題規模n的函數。漸近空間複雜度也常常簡稱為空間複雜度。

空間複雜度(space complexity)是對一個算法在運作過程中臨時占用存儲空間大小的量度。一個算法在計算機存儲器上所占用的存儲空間,包括存儲算法本身所占用的存儲空間,算法的輸入輸出資料所占用的存儲空間和算法在運作過程中臨時占用的存儲空間這三個方面。算法的輸入輸出資料所占用的存儲空間是由要解決的問題決定的,是通過參數表由調用函數傳遞而來的,它不随本算法的不同而改變。存儲算法本身所占用的存儲空間與算法書寫的長短成正比,要壓縮這方面的存儲空間,就必須編寫出較短的算法。算法在運作過程中臨時占用的存儲空間随算法的不同而異,有的算法隻需要占用少量的臨時工作單元,而且不随問題規模的大小而改變,我們稱這種算法是“就地\"進行的,是節省存儲的算法,如這一節介紹過的幾個算法都是如此;有的算法需要占用的臨時工作單元數與解決問題的規模n有關,它随着n的增大而增大,當n較大時,将占用較多的存儲單元,例如将在第九章介紹的快速排序和歸并排序算法就屬于這種情況。如當一個算法的空間複雜度為一個常量,即不随被處理資料量n的大小而改變時,可表示為o(1);當一個算法的空間複雜度與以2為底的n的對數成正比時,可表示為0(10g2n);當一個算法的空i司複雜度與n成線性比例關系時,可表示為0(n).若形參為數組,則隻需要為它配置設定一個存儲由實參傳送來的一個位址指針的空間,即一個機器字長空間;若形參為引用方式,則也隻需要為其配置設定存儲一個位址的空間,用它來存儲對應實參變量的位址,以便由系統自動引用實參變量。

繼續閱讀