st_first
: 以遞迴的方式找到 S-tree 最左邊的節點,而因 S-tree 為一種 BST,因此最左邊的節點也是整個 S-tree 的最小值。st_last
: 以遞迴的方式找到 S-tree 最右邊的節點,也是整個 S-tree 的最大值。st_rotate_left
: 當 AVL tree 左半邊不平衡時,需要做的 rotate 操作。st_balance
: 計算 AVL tree 是否平衡,正常值為 -1, 0, 1。st_max_hint
: 計算 n 節點的最大高度。st_update
: 判斷以 n 節點為首的子樹是否平衡,如不平衡則做 rotate。最後判斷子樹高度是否有改變,如果改變則執行 st_update(root, p)
判斷與 Sibling 是否平衡。st_insert
: 插入 n 節點至指定的 d 位置,確認 s-tree 是否平衡。st_replace_right
: 在二元搜尋樹中刪除節點時需要選取子樹的一個節點做替換,這個函式是在替換節點為右子樹的情境下,實作以 r
節點替換 n
節點。st_remove
: 實作 s-tree 移除的函式。
AAAA
: 當被移除節點 del
存在右節點,尋找右子樹最小值替換以符合 BST 特性,而找到替換節點後還需要處理 node link 細節,因此填空答案應為 st_replace_right(del, least)。BBBB
: 因為移除的節點是 least
,所以應該更新原先 least
的 parent 才是最小的 cost,但因為 link 已經被刪去,所以次處應填 st_update(root, st_right(least)) 或 st_update(root, st_first(least))。CCCC
: 找到替換節點後還需要處理 node link 細節,因此填空答案應為 st_replace_left(del, most)。DDDD
: 因為移除的節點是 most
,所以應該更新原先 most
的 parent 才是最小的 cost,但因為 link 已經被刪去,所以次處應填 st_update(root, st_left(most)) 或 st_update(root, st_last(most))。EEEE
: n 節點為 leaf node 移除自己後,需要確保 s-tree 為平衡,因此要執行 st_update(root, parent)。__treeint_dump
: 這裡要將 s-tree 中所有節點的大小依升序排列輸出至終端機,而二元樹的 in-order Traversal 正好能夠實現這個功能。因此 FFFF
為應先尋訪的 st_left(n),而 GGGG
為最後尋訪的 st_right(n)。(alignment & mask) == 0
判斷當對齊大小為 2 的冪時計算,可以透過 &
將餘數清空,但因為計算後不能小於原本使用的 sz
大小,所以要先加上 alignment - 1
,因此 MMMM
應該填 (sz + mask)&(~mask)。下方包含 qsort_mt
和 qsort_thread
函式。
qs
的 status 為 idle。HHHH
: 建立多個 qsort_thread
的執行緒後,一開始會在狀態 idle 等待被觸發,因為 qs->stat
為多個執行緒共用的資料,因此更動時需要 mutex 機制保護。而如果要控制執行順序則需要透過 condvar 的機制,所以 HHHH
應為 pthread_cond_wait(&qs->cond_st, &qs->mtx_st) 等待 idle 狀態被修改後觸發 condvar。JJJJ
: 下方程式碼的 116 至 119 行,因為修改了 qs2
的狀態因此需要透過 pthread_cond_signal(&qs2->cond_st) 通知。