資料結構 演算法效率

2021-09-02 05:34:25 字數 2247 閱讀 8467

資料結構之前,先來了解兩個概念——時間複雜度

由來:這裡的時間複雜度不是程式執行的時間。評價乙個演算法的好壞,並不能通過程式執行的快慢來評估。因為程式的執行快慢還有很多因素,和計算機硬體有關,所以如果在不同的電腦上 ,執行的時間可能不一樣 。那麼這裡的時間複雜度指啥,指的是演算法中基本操作的執行次數。比如某一句基礎語句執行了多少次。這樣就可以很直觀的評價乙個演算法的好壞了。

表示: 大o漸進表示法o(n)

步驟:首先用 f(n )來表示基礎語句的執行次數,

例子:

//c語言

function(int n)

printf("\n");

}for(int k = 0;k < n; ++k)

}

這裡我們用 printf("%d ",temp++); 做基礎語句,它一共執行了多少次呢?f(n) = n * n + 2 * n,所以o(f(n) ) = o(n^2);因為我們的大o漸進表示法只是保留執行次數的最高次冪。(官方語言看不懂)

下面寫幾個栗子。來進行充分的理解。總結大o漸進表示法如何表達。首先啊,大o 漸進表示法是演算法的最壞情況,也就是說執行到最後一次操作,比如迴圈趙某個數,最壞情況就是迴圈的最後一次找到或者沒有找到。

栗子1、

//c語言

void founc1(int n)

while (m--)

}

解:這個程式呢,我們以l++為基礎語句,那麼我們可以看見 l++ 執行了 n + 10次,所以 f(n) = n + 10 ;那取最高次,大o漸進表示法就是 o (n)

栗子2、

//c語言

void founc2(int n , int m)

while (m--)

}

解:這個一看,就可以寫下 f(n) = m + n。那麼 o (f(n)) = o(m + n)。

栗子3、

//c語言

void founc3(int* arr, int row)

} }}

解:這個是個簡單草率的氣泡排序,是我寫的簡單草率昂。氣泡排序的規則,我們知道啊,第一次交換 row - 1次,第二次交換 row - 2 ……一直到最後一次,總的次數是多少呢?可以用等差求和的公式吧? 1+ 2 +3 +4 + 5 +(n-1),最後等於的就是(n(n+1))/2,f ( n ) = (n^2 + n)/2,所以是o (f(n) )= o(n^2)。

栗子4、

//c語言

void founc4(int* arr, int num)

else if (mid < num)

else

}return -1;

}

解:這是個寫法簡單的二分查詢的演算法。這個時間複雜度是有點不好算的。我們先明白二分查詢的演算法。二分查詢就像摺紙。一直對著,二二分查詢也是,一直從中間分知道找到這個數。那麼最壞的情況就是一直找到最後的乙個數。這個時候,一共分了幾次呢?假設 n 個數。那麼查詢到最後,就是。1 * 2 *2 *2 *2……*2 = n,這個時候的次數 x ,是不是就是 2 ^x = n ;所以時間複雜度是 o (log n)。這裡 log 是以2 為底。(是不是已經把對數忘了?^_^)

栗子5、

// c語言

int founc5(int num)

return founc5(num - 1) + founc5(num - 2);

}

解:這是個遞迴求斐波那契數列,給乙個數,返回數列的第num個數。當知道什麼是斐波那契數列的時候,就知道這個時間複雜度是多少了。當這個 num 太大的時候,可能計算機要算很久很久。可以想象成楊輝三角,直接說它的時間複雜度是 o ( 2^ n)。

時間複雜度就算到這兒了。這個是評判乙個演算法的好壞的經典手段。如何計算,在後面的資料結構階段還會遇見很多程式。所以不著急。

其實還有個概念和它差不多,是空間複雜度。其實它是看乙個程式臨時占用多少記憶體空間。然而現在記憶體還是比較大的 8g ,16g。都還是比較大的,所以也不必考慮。但是如果一定要算,就算算變數的個數吧。也用大o漸進表示法。常數個變數就是o( 1 ),n個就是o(n)。和時間複雜度一樣的。

資料結構開始了,一起走過。嘿~

資料結構 求演算法效率的介紹

一 演算法效率。二 時間效率。一 定義 1 時間效率也被稱為時間複雜度,它反映的是乙個演算法所執行時間的快慢,時間複雜度大,則效率低,反之,效率就高。2 在電腦科學中,演算法的時間複雜度是乙個函式,它定量描述了該演算法的執行間。一 個演算法執行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程...

資料結構與演算法(Python)00 2演算法效率衡量

第一次嘗試 import time start time time.time 注意是三重迴圈 for a in range 0 1001 for b in range 0 1001 for c in range 0 1001 if a 2 b 2 c 2and a b c 1000 print a,...

資料結構 關於KMP演算法的效率分析

通常的kmp演算法可以描述如下,不知道的可以查相關資料。從s的pos位置開始尋找字串t int index kmp string s,string t,int pos else j next j i不變 不回溯 j跳動 if j t.length return i t.length 匹配成功 els...