1. 程式人生 > 其它 >Trie樹簡介及其應用

Trie樹簡介及其應用

技術標籤:資料結構與演算法資料結構

原理

相鄰元素之間比較,然後依次把較小的元素挪到前面,直至所有的元素排成從小到大的順序。

複雜度分析的4個概念

1.最壞情況時間複雜度:程式碼在最壞情況下執行的時間複雜度。
2.最好情況時間複雜度:程式碼在最理想情況下執行的時間複雜度。
3.平均時間複雜度:用程式碼在所有情況下執行的次數的加權平均值表示。
4.均攤時間複雜度:在程式碼執行的所有複雜度情況中絕大部分是低級別的複雜度,個別情況是高級別複雜度且發生具有時序關係時,可以將個別高級別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。

複雜度計算

雙層for迴圈,時間複雜度為O(N^2),計算規則:(n-1)+(n-2)+…+1,就是一個等差數列求和過程,Sn=n*(n-1)/2。這裡給出等差數列的求和公式:

在這裡插入圖片描述
N為項數,d為公差,a1,an分別為首項和末項。
對於空間複雜度來說,這裡應該是O(1)。一般就看有沒有來回複製或者創造新的陣列之類的,如果沒有的話,基本上都是O(1)。

public void bubbleSort(int arr[]) {
    boolean didSwap;
    for(int i = 0, len = arr.length; i < len - 1; i++) {
        didSwap = false;
        for(int j = 0; j < len - i - 1; j++) {
            if(arr[j + 1] < arr[j]) {
                swap(arr, j, j + 1);
                didSwap = true;
            }
        }
        if(didSwap == false)
            return;
    }    
}

注意點

最好情況下,時間複雜度可以說成是O(N),因為設定了標誌位didSwap ,如果最開始就是排序好的,那麼就不會進行任何交換,還有一種極端情況,如果數組裡面的元素只有一個,那麼就是O(1)。

疑惑點

其實這裡嚴格來講,即使陣列本身就是排序好的,沒有進行任何交換,但是實際上判斷次數依然沒有發生改變,還是進行了n*(n-1)/2次,所以時間複雜度還是可以理解成O(n^2),或許是if條件判斷不算在內的話,那麼最佳時間複雜度就可以理解成O(N)。