簡單程式的時間複雜度分析

daqianmen發表於2021-09-09

一、演算法的概念
演算法中基本操作的執行次數一般是與問題的規模有關的。對於節點個數為n的資料處理問題,用T(n)表示演算法基本操作的執行次數。為評價演算法的時間複雜度與空間複雜度,我們引入記號為“O”的數學符號。設T(n)和f(n)是定義在正整數集合上的兩個函式,如果存在正常數C和No,使得當n>=No時,都有0 常見演算法時間複雜度排序為:
**Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)
圖片描述
演算法時間複雜度的最小、最大和平均值:

  1. 演算法在最好的情況下的時間複雜度是指演算法計算量的最小值。
  2. 演算法在最壞的情況下的時間複雜度是指演算法計算量的最大值。
  3. 演算法在平均情況下的時間複雜度是指演算法在所可能的情況下的計算量經過加權計算出的平均值。

二、常用程式的簡單的時間複雜度分析
**首先我們將每次執行一行程式的時間複雜度記為O(1)。
時間複雜度分析的基本策略是:從內向外分析,從最深層開始分析。如果遇到函式呼叫,要深入函式進行分析。

1、對於一個迴圈,假設迴圈體的時間複雜度為 O(n),迴圈次數為 m,則這個
迴圈的時間複雜度為 O(n×m)。

void aFunc(int n) {
    for(int i = 0; i 

所以上述程式的時間複雜度為O(n×1),為O(n)。由此延伸,多重迴圈的時間複雜度可以內外層迴圈相乘獲得

void aFunc(int n) {
    for(int i = 0; i 

所以上述程式的時間複雜度為O(n × n × 1)=O(n^2)。


2.對於順序執行的程式語句,時間複雜度可用疊加計算

void aFunc(int n) {
    for(int i = 0; i 

所以時間複雜度的計算為O(n^2)+O(n),由於只考慮量級的關係,所以該程式碼塊的時間複雜度為O(n^2)。


3.對於條件判斷語句,總的時間複雜度等於其中 時間複雜度最大的路徑 的時間複雜度。

void aFunc(int n) {
    if (n >= 0) {
        // 第一條路徑時間複雜度為 O(n^2)
        for(int i = 0; i 

此時的時間複雜度為O(n^2)。


練習1

void aFunc(int n) {
    for (int i = 2; i 

需要滿足i*2


練習

long aFunc(int n) {
    if (n 

顯然執行次數,T(0) = T(1) = 1,同時 T(n) = T(n - 1) + T(n - 2) + 1,這裡的 1 是其中的加法算一次執行。
顯然 T(n) = T(n - 1) + T(n - 2) 是一個斐波那契數列,透過歸納證明法可以證明,當 n >= 1 時 T(n) 4 時 T(n) >= (3/2)^n。
所以該方法的時間複雜度可以表示為 O((5/3)^n),簡化後為 O(2^n)。


連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1727/viewspace-2808099/,如需轉載,請註明出處,否則將追究法律責任。

相關文章