數據結構與算法(2、從Reverse到大O表示法)

接上面的問題,如何從實現一個數組的翻轉,其實很簡單
1、定義一個頭,一個尾
2、判斷條件:頭是否大於尾
3、交換元素值
4、頭,尾更向中間靠攏
代碼如下:

//關鍵代碼
public static void reverseArray(int arr[]){
int left=0;
int right=arr.length-1;
while(left<right){
   int temp=arr[left];
   arr[left]=arr[right];
   arr[right]=temp;
   left++;
   right--;
}
}

這樣看來,我們似乎實現了一個數組的翻轉,我們可以稍微計算一下,從函數的功能而言,是已經實現了的,但是從函數的可執行性上面,這段代碼的執行效率非常低。而這段代碼的運行時間,是需要依靠問題的規模去劃定的。
那麼,這樣的描述我們可以用大O表示法進行表達。
引用百度百科的話:

/*
算法的執行時間等於它所有基本操作執行時間之和, 而一條基本操作的執行時間等於它執行的次數和每一次執行的時間的積,
如下:
算法的執行時間 = 操作1 + 操作2 + ... + 操作n
操作的執行時間 = 操作執行次數 X 執行一次的時間
然而存在一個問題,不同的編程語言,不同的編譯器,或不同的CPU等因素將導致執行一次操作的時間各不相同,這樣的結果會使算法的比較產生歧義, 於是我們假定所有計算機執行相同的一次基本操作所需時間相同,而把算法中基本操作所執行的最大次數作爲量度。就是說我們把算法的執行時間簡單地用基本操作的執行次數來代替了。
那麼除此之外,基本操作是什麼? 它可以是基本運算,賦值,比較,交換等,如在排序中,基本操作指的是元素的比較及交換。而在線性查找中,它是數據的比較。
時間複雜度和大O表示法
當問題規模即要處理的數據增長時, 基本操作要重複執行的次數必定也會增長, 那麼我們關心地是這個執行次數以什麼樣的數量級增長。所謂數量級可以理解爲增長率。這個所謂的數量級就稱爲算法的漸近時間複雜度(asymptotic time complexity), 簡稱爲時間複雜度。如何分析這個數量級呢? 由於基本操作的執行次數是問題規模n 的一個函數T(n), 所以問題就是我們要確定這個函數T(n)是什麼, 然後分析它的數量級, 擁有相同數量級的函數 f(n) 的集合表示爲 O(f(n)), O是數量級的標記。如果T(n)的數量級和f(n)相同,
顯然T(n) ∈ Of(n)。這個函數的值表示當我要處理的數據量增長時,基本操作執行次數以什麼樣的比例增長。
*/

這就是大O表示法,很簡單來講,就是將算法的運行時間進行了一個模擬漸近。利用大O表示法,我們可以很容易估計出算法的時間需要多少。
這也是我們在編程的時候具有的很好的作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章