Trie樹簡介及其應用
阿新 • • 發佈:2021-02-13
原理
相鄰元素之間比較,然後依次把較小的元素挪到前面,直至所有的元素排成從小到大的順序。
複雜度分析的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)。