看板 talk 關於我們 聯絡資訊
禮拜一、二翹掉,不然Hashing就看完了,唉。 有錯請指教。 知道怎麼寫Algo,就知道怎麼操作,舉個例子便能知道Stability。 知道怎麼寫Recursive time fcn,就知道時間複雜度。 Thm: - Binary Search - 給定 n筆records,求 比較過程之Decision Tree決策樹 - 給定 n筆records,求 最多比較次數 Decision Tree高度,即高度最小化的BT - 給定 要找的數,求 比較次數 - 用Decision Tree來描述sorting(採用comparison-based skill)之比較過程 Decision Tree是BT,non-leaf是比較node,leaf是排序結果 - 給定 n筆records,求 最多比較次數 Ω(n*log n),即 Decision Tree高度-1 >= ([log n!]+1)-1 ≒ n*log n - Selection Problem - Find min & max 找min & max T(n) = 3n/2 用遞迴,n筆需要,2筆比1次決定大小,n-2筆找好大小的分別跟2筆大小再比1次, 算recursion time fcn - Select ith smallest item among unsorted n data n個找第i小資料 用quick sort,只要找一邊。 - avg, best O(n) - worst O(n^2),可用middle of three or medium of mediums選pk改善 假設k為偶數(k為奇數要微調) T(n) = O(n) + O(n) + T(n/k) + O(n) + T(3n/4+k) k >= 5 O(n),k < 5 O(n*log n) 1. 每k個組一group,將n個data切成n/k個group, 除一個可能不足每個group有k個data O(n) 2. 每個group各自排序(n/k)*O(k^2) = O(k*n) = O(n) 3. 每個group第k/2個data是該group之median,共n/k個median, 遞迴找出n/k個medians之median(n/k個找第n/2k個小資料)作為pk T(n/k) 4. 用q=Partition(A,p,r)在A[p],A[r]間把pk放到正確位置A[q],O(n) 5. i=pk直接回傳,i比pk小 select(A,p,q-1,i),i比pk大 select(A,q+1,r,i-k) (至少有一半的groups(1/2)*(n/k)-1 pk所在的group -1 不足k個data的group) *(k/2) = n/4-k 個比pk大的data 所以有3n/4+k個比pk小的data 最差花T(3n/4+k),要從3n/4+k個找第i小的資料 Search Algo: - Linear Search (iterative) - with sentinel哨兵 Array or Link list(Data movement較Array少) O(n),(1+...+n)/n = (n+1)/2 - Binary Search (iterative or recursive) Data Comparison較Linear Search少 divide and conquer, prune and search Array O(log n) Sort Algo: 初等 - Insertion Sort (插入前面排好的,順便排) 適合資料量少(Internal Sort) Stable Sorting in-place time(comparison) avg O(n^2) ~ O(n) space O(1),r, A[0]=-∞ - Binary Insertion Sort time(comparison, movement) O(n^2) - Linear Insertion Sort time(comparison, movement) O(n^2) - Selection Sort (右邊剩下,找最小交換至左) 適合大型紀錄(一筆紀錄由很多欄位組成),因為每一回合頂多SWAP一次 Unstable Sorting in-place 可以用或不用if(檢查是否是min,來決定是否用SWAP) time O(n^2) space O(1),min, temp in SWAP fcn - Bubble Sort (由左而右兩兩交換,最大升最高 or 由右而左兩兩交換,最小降最低) Stable Sorting in-place time avg O(n^2) ~ O(n) space O(1),flag(檢查有無SWAP), temp in SWAP fcn - Shell Sort (n/2^k型 或 2^k-1型 或 自訂型) Unstable Sorting in-place time avg O(n^2) ~ 一般O(n^(3/2)) space O(1),flag, temp in SWAP fcn ---> 我感覺不常考。 高等 - Quick Sort (Hoare左大交換右小,直到兩軍交會 or Comen小的丟至左) divide and conquer Unstable Sorting in-place time O(n^2) ~ avg O(n*log n) Hoare資料相同是best,Comen資料相同是worst。由小到大或由大到小都是worst - 改善worst case方法 - randomized quick sort使用亂數挑pivot key - middle of three - median of medians中間鍵之中間鍵 space O(log n) ~ O(n) 源自recursion所要的stack space,stack size取決recursive call深度(次數) - Merge Sort (iterative,k-way每個pass每k組一組 or recursive每次呼叫遞迴就是切分成k組) divide and conquer(recursive) External Sort Stable time O(n*log n) 注意,Merge和Sort(merge sort)部分!!! - 作2-way merge Merge:O(n) 每回合merge最少比較次數run1或run2長度,最多比較次數run1+run2長度-1 = n-1 Sort:T(n) = 2*T(n/2) + O(n) - 沒有Selection Tree 選擇樹,作k-way merge(k runs合併成1 run) Merge:O(n*k) Sort:T(n) = k*T(n/k) + O(n*k) = k*T(n/k) + O(n) - Selection Tree,協助k-way merge加速合併過程 - Winner Tree (與鄰居比較找min) - Loser Tree (與父點比較找min,較常用因為參與比較的數較少) - k個runs作k-way merge Merge:O(k) + O(n*log k) 第一次建樹O(k) + 執行n-2次從k runs比較找min O(n*log k) Sort:T(n) = k*T(n/k) + O(k) + O(n*log k) = k*T(n/k) + O(n) - m個runs作k-way merge Merge:O(m*k) + O(n*log m) O(每次建Selection Tree需k*共建(k^(h-1)-1)/(k-1)個Selection Tree) = O(k*(m-1)/(k-1)) = O(m) O((logk m回合)*(m/k個groups做k-way search)*(k個runs一組)* (每個run有n/m個data數)*(每次Selection Tree剩下比較次數log k) = O(logk m*(m/k)*k*(n/m)*(log k)) = O(logk m*n*log k) = O(n*log m) Sort:T(n) = k*T(n/k) + O(m) + O(n*log m) = k*T(n/k) + O(n) space O(n) space O(n),暫存每一回合pass之merge結果 - Heap Sort (Bottom up建heap,每回合再執行類似delete-max動作) Unstable Sorting in-place time O(n*log n),建heap O(n) + 執行n-1回合delete-max動作O(n*log n) space O(1),temp in SWAP fcn(最後一點要與root swap) Linear-Time Sorting method (採用distribution分派、merge合併,而非comparison-based skill) - Radix Sort(LSD Radix Sort) (每回合依某位數分派到bucket完再合併,位數從最小直到最高) Stable time O(d*(n+r)),分派O(n)、合併O(r)共d回合 space O(r+n),link list O(r*n),array r個bucket,每個max size n - Buckets Sort(MSD Radix Sort) (分派到bucket後各自sorting再合併,分派合併只一次) Stable - Counting Sort (建用作計數的array Count,掃Input計數在Count,Count累加計數, Input由右而左依Count存的位置放在Output) Stable time O(n+k) O(k) + O(n) + O(k) + O(n) 設定Count皆0 O(k),掃Input計數在Count O(n),Count累加計數O(k), Input由右而左依Count存的位置放在Output O(n) where n個input,range 0~k 常用作LSD的subroutine,兩者結合處理range更大的data 即便k是O(n^r)也可用LSD作r回合每次/n再%n, 得到的只有O(r*n)以n為基底的r位數LSD sort, 使得counting sort只有O(n+k) = O(n+n) = O(n) space O(n+k) -------------------------------------------------------------------------- 以下還未弄懂: 為何有些得random access(array) 有些得sequential access(link list) 上使用 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.226.25.212 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/talk/M.1730480419.A.B8D.html ※ 編輯: OriginalGod (36.226.25.212 臺灣), 11/02/2024 15:47:28