14.2-1 通過為結點增加指標的方式,試說明如何在擴張的順序統計樹上,支援每一動態集合查詢操作 minimum、maximum、successor 和 predecessor 在最壞時間 o(1) 內完成。順序統計樹上的其他操作的漸進性能不受影響。
answer:
① minimum:用乙個指標指向樹中最小的元素。每次插入時與 minimum 比較檢測是否需要更改。若刪除 minimum,則指標指向它的後繼。旋轉不影響 minimum。
② maximum:同 minimum。
③ predecessor、successor:給每個結點新增指向前驅和指向後繼的指標。
插入:時間複雜度仍為 o(lgn)
插入 x 結點時,若 x ≠ maximum,利用 o(lgn) 時間找到 x 的後繼 y,找到 y 後,y 的前驅 w 則只需 o(1) 時間,在用 o(1) 時間更新 w, x, y 的前驅、後繼。若x == maximum,則利用 o(lgn) 時間找 x 的前驅,同理。
刪除:和插入類似。
旋轉不影響前驅、後繼的指標。
14.2-2 能否在不影響紅黑樹任何操作的漸進性能的前提下,將結點的黑高作為書中結點的乙個效能來維護?說明如何做,如果不能,請說明理由。如何維護結點的深度?
answer:可以,插入和刪除操作支隊根結點刀某一葉結點上的路徑上的結點(或部分叔結點)進行修改,即 o(lgn) 個結點。
而自插入(刪除)結點向上,每個結點黑高修改只需 o(1) 時間。根據插入和刪除的不同情況進行修改操作即可。所以總的修改時間為 o(lgn)。
*14.2-3 設 ⊙ 為乙個滿足結合律的二元運算子,a 為紅黑樹中每個結點上的乙個要維護的屬性,假設在每個結點 x 上增加乙個屬性 f,使 x.f = x1.a ⊙ x2.a ⊙...⊙ xm.a,其中 x1, x2,...,xm 是以 x 為根的子樹中按中序次序排列的所有結點。說明在一次旋轉後,如何在 o(1) 時間內更新 f 屬性。對你的擴張稍做修改,使得它能夠應用到順序統計樹的 size 屬性中。
answer:旋轉只對 o(1) 個結點修改,旋轉後只需對旋轉了的 o(1) 個結點進行 x.f = x.left.f ⊙ x.a ⊙ x.right.f 修改即可。所以總時間為 o(1)。
answer:在紅黑樹中查詢關鍵字 a;若不存在,則插入關鍵字 a,再查詢 a 的後繼;刪除結點 a。然後呼叫 m 次後繼函式,直至發現下乙個後繼的關鍵字大於 b。ps:連續 m 次呼叫後繼函式的時間為 o(m+h),即o(m+lgn)。證明見 12.2-8 。
演算法導論筆記 14資料結構的擴張
一 概述 一些工程應用只會使用教科書式的標準資料結構,但是也會有些應用需要對現有的資料結構進行少許的創新和改造,只有很少的情況會創造全新的資料結構。二 動態順序統計 順序統計 n個元素中第i個順序統計量,就是具有第i小關鍵字的元素。對於乙個無序的集合,可以在 o n 的時間內得到任意的順序統計量。利...
資料結構的擴張 演算法導論第14章(194)
偽 解釋 為明白os select是如何操作的,在上圖所示的順序統計圖上查詢第17小元素的查詢過程。以x為根開始,其關鍵字為26。i 17.因為在26的左子樹大小為12,故他的秩為13,因此,秩為17的節點是26的右子樹第17 13 4小得瑟元素。遞迴呼叫後,x為關鍵字41的節點,i 4,因為41的...
《演算法導論》第14章 資料結構的擴張 2
在上一節中,我們為樹結點新增size域表示每顆子樹的大小,即包含的結點個數,擴張了 二叉查詢樹為其增加順序統計量的查詢功能。更為自然的想法是直接新增順序統計量rank域 到每個樹結點上。這一節我們就來看下在這樣的設計下,如何擴張來完成上一節相同的功能。當我們插入乙個結點到二叉樹中,假設它的順序統計量...