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) 通知。