最壞,平均和最佳運行時間(Worst, Average and Best Cases)
在上一篇文章中,我們討論到了漸進分析可以解決分析算法的問題,那么在這一篇中,我們用線性搜索來舉例說明一下如何用漸進分析法來分析算法的性能。
我們從三個方面分析算法:
1.最壞情況
2.平均情況
3.最佳情況
這是一段很簡單的線性查找的代碼 從arr[] 中查找x
// Linearly search x in arr[]. If x is present then return the index, // otherwise return -1 int search(int arr[], int n, int x) { int i; for (i=0; i<n; i++) { if (arr[i] == x) return i; } return -1; } /* Driver program to test above functions*/ int main() { int arr[] = {1, 10, 30, 15}; int x = 30; int n = sizeof(arr)/sizeof(arr[0]); printf("%d is present at index %d", x, search(arr, n, x)); getchar(); return 0; }
最壞情況分析(通常都是可以完成的)Worst Case Analysis (Usually Done)
在最壞運行時間分析中,我們計算運行時間的上界限。這種最壞情況下,一定會運行最大的操作數量(maximum number of operations)在線性搜索中,最壞的情況時發生在x不在array[]中,所以search()會用x和所有在array[]中的元素比較,所以最壞時間復雜度是O(n);
平均情況分析 ( 有時可以完成)Average Case Analysis (Sometimes done)
在平均情況分析中,我們計算所有可能的輸入的運行時間,把所有的時間加起來除以數量,我們必須知道這些情況的分布。在線性搜索算法下,我們假設所有的情況是平均分布的(包括x不在array[]的情況.(在一個有n個數的數組里 x的位置有n+1種情況)
average case time = =
= O(n)
最佳情況分析Best Case Analysis (Bogus)
在最佳情況分析中,我們計算運行時間的下界限,算法用最少的操作就可以完成,在線性搜索中,最佳的情況是x的位置就是第一個,所以說總的操作次數是固定的,不取決於n的大小。所以在最佳情況下時間復雜度是O(1)。
在大多數情況下,我們用最差情況來分析算法,我們可以保證運行時間的上界限,這對於算法來說是一個好的信息。
對於平均情況的分析,對於很多具體的例子不是很容易分析。因為我們必須知道輸入的分布情況。
而對於最佳情況的分析就不是很好了,保證下界限並不能提供任何信息尤其是在最壞的情況下,有可能你的算法要運行很久甚至一年。
對於一些算法,這三種情況的漸進分析都是一樣的,例如沒有最壞,最佳的情況。例如歸並排序,所有的情況的時間復雜度都是O(nlogn) 。而對於其他大多數排序算法都有最壞情況和最佳情況,例如基本的快速排序(選擇基准的時候pivot 選最左或最右的元素)。那么最壞情況就是輸入的數組已經是排序好的,最好的情況就是數組總是能分成兩個大小一樣的子數組。對於插入排序,最壞的情況就是輸入數組是逆序,最好的情況是輸入數組是已排序的。
原文鏈接:
http://www.geeksforgeeks.org/analysis-of-algorithms-set-2-asymptotic-analysis/
翻譯:
Rui