時間效率分析

2021-06-18 04:56:58 字數 1801 閱讀 7499

也許對於學過資料結構的同胞來說,這是乙個再簡單不過的問題,但對於剛起步的菜鳥來說,這是個很寶貴的資源,在各大oj過題,時有超時現象出現,苦逼的我只能換思路,換**,但自從有了時間效率分析,媽媽再也不用擔心我會超時了,那麼接下來,我便用最菜鳥的語言譜寫較完善的時間效率分析。

演算法的時間效率分析主要在於計算基本語句的運算次數,表示為t(n)=o(f(n)),f(n)為運算次數,下面通過幾個例子來說明吧

1.普通程式

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

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

如上是求兩個n階矩陣相乘運算的演算法時間複雜度,(不懂**含義不用緊,此處只用來講時間效率問題)語句1 歷經兩個for語句,每個for進行n次運算,故計算語句1次數為c1*n²,c1為常數(計算方式不同,基本語句常數就不同,如語句2有加乘),

同理可得,最後t(n) = f(n) = c1*n² + c2 * n*n*n所以該演算法的時間複雜度為t(n) = o(n的3次方)

2.變數增長

for(i=1;i <= n; i = 2 * i)

printf("i = %d\n",i); //基本語句

不難看出,第一次i == 1,第二次 i==2,第三次 i==4 ,依此可知,2的f(n)次方 < n,

所以f(n) <= ibn(ib為兩邊log後的化簡) 故f(n) <= o(ibn)。

3.有些資料元素取值不同,則演算法複雜度也會不同,此時演算法的時間複雜度應是資料元素最壞情況下取值的時間複雜度(簡稱最壞時間複雜度)。

void  bubblesort(int a, int n)

} }

}

如上為氣泡排序的**,當某次排序過程中木有任何陣列元素需要交換時,表明flag = 0標記而結束。但是最壞的情況下,每次排序過程中都至少有一對陣列元素交換位置,因此,基本語句1最多隻進行n次,其餘語句由於氣泡排序,一次for排好一次數,下次便少排一次數,即第一次n-1次,第二次,n-2次。。依次類推第n - 1次時,1次,故f(n) ≈ n + 4 * (n2/2)(等差數列求和,4個基本元素) 故 t(n) = o(n2)。

4.一些演算法因資料處理位置不同而不同,此時應計算等概率取值情況下的平均時間複雜度。

下面演算法在乙個有n個資料元素的陣列a中刪除第i個位置的陣列元素,要求刪除成功時,資料元素減1,求該演算法的時間複雜度。

int delete(int a,int n,int i)

該演算法隨刪除資料位置不同而不同,例如刪除位置在第一位,則後面n-1個資料都要向前移動,若刪除位置在最後一位,各位就不用移位了,設e為移動資料的平均次數,有e = [(n-1) + (n-2) +....+ 2 + 1 + 0] / n =(n-1)/2,所以t(n) = o(n)。

演算法時間效率分析

求效率函式的一般方法 big o 表示式 演算法的複雜度分析包括空間複雜度分析和時間複雜度分析。對於現代計算機,記憶體已經比較足夠,對演算法效率影響最大的是時間複雜度。在時間複雜度的分析中,拋開具體機器,我們主要研究的是執行的語句數量。執行的語句數量取決於需要處理的元素個數和演算法的迴圈結構。引入函...

MySQL Order By Rand 效率分析

最近由於需要大概研究了一下mysql的隨機抽取實現方法。舉個例子,要從tablename表中隨機提取一條記錄,大家一般的寫法就是 select from tablename order by rand limit 1。但是,後來我查了一下mysql的官方手冊,裡面針對rand 的提示大概意思就是,在...

php include效率分析

2013年1月16日 11 54 05 time microtime true include once b.php obj new b for i 0 i 100000 i echo microtime true time,time1 microtime true for i 0 i 100000...