字尾樹的相關證明

2021-09-20 13:03:01 字數 972 閱讀 5680

——《高階資料結構》

1.字尾樹中的節點個數至多為2m-1,其中m為字串的長度。

證明:由字尾樹的定義我們知道一共有m個葉節點,並且每個內部節點至少有2個孩子節點。假設總共有n個節點,則內部節點的個數為n-m。於是,我們可以得到如下的不等式:2(n-m)+1<=n;即n<=2m-1。因此,字尾樹的壓縮儲存方式導致其節點個數也是與m呈線性關係。

2合理選取邊標記的表示方式可以使得至多花費o(m)的空間複雜度來儲存。

證明:如果我們直接按照定義,用字串存邊的話,那麼儲存可能要花費o(m的2次方)的空間複雜度,讀者可以自行構建串「abcde」的字尾樹然後加以檢驗。然而,由於子串是原串的連續一部分,所以儲存好原串之後,每個標記只需要用一對數(u,v)來表示該子串對應的是原串的那一部分。所以,儲存空間複雜度就與邊數呈線性關係,即與點數呈線性關係,也就是o(m)。

3.如果新增乙個對應標記為ap的節點v到當前樹中,要麼標記p對應節點已經在樹中,要麼接下來一次擴充套件會生成路徑標記為p的節點。

證明:根據擴充套件規則,只有規則2會產生新的節點。也就是說路徑ap對應的位置之後還有不同於當前新增的字元,假設為c。所以在下一次擴充套件,查詢到串p的位置時,其後面也有字元c。如果p位置為邊內部,那麼會新建節點;如果是乙個節點,那麼肯定是內部節點。綜上所述,命題成立。

4.乙個新建節點在下一次擴充套件完之前或有乙個字尾鏈。

證明:由命題1可知,新建乙個節點之後,在下一次擴充套件的時候會找到或者建立其字尾鏈指向的節點,而每個階段最後一次擴充套件不會產生新的節點(因為最後一次擴充套件只新增乙個字元)。綜上所述,我們完美的維護了字尾鏈,並且每次查詢時字尾鏈總是存在的。

5.任意節點v的深度至多比其字尾鏈指向節點s(v)的深度大1.

對於節點v的所有祖先,它們都有自己的字尾鏈,由於v的祖先的路徑標記為v的路徑標記的字首,所以v的祖先的字尾鏈指向節點的路徑標記也是s(v)的路徑標記的字首。也就是說,v的祖先的字尾鏈指向節點s(v)的祖先,除非v的某個祖先沒有字尾鏈。因此,不難發現,v的深度至多比s(v)的 深度大1.

矩陣相關的小證明

如何用高斯消元法求矩陣的逆?如何判斷乙個矩陣是否有非零特徵值?設 a 是 n 階方陣,則有 a 有非零特徵值 iff a ne 0 證明 a 沒有非零特徵值 iff lambda i a lambda n iff lambda i a sim lambda i iff a 0 color 上述證明中...

字尾陣列模板 LCP小證明

複習了一遍字尾陣列 關於lcp的證明 簡單的說下 設p min height k ilcp i,j p,顯然lcp i,j p 排名越相近,字首越可能相同 假設lcp i,j tp。則字串sa i 和字串sa j 前tp位相同。從sa i 到sa j 之間的字串一定是從sa i 到sa j 字典序遞...

字尾樹 字尾陣列

在字串處理當中,字尾樹和字尾陣列都是非常有力的工具,其中字尾樹大家了解得比較多,關於字尾陣列則很少見於國內的資料。其實字尾陣列是字尾樹的乙個非 常精巧的替代品,它比字尾樹容易程式設計實現,能夠實現字尾樹的很多功能而時間複雜度也不太遜色,並且,它比字尾樹所占用的空間小很多。可以說,在資訊學競賽 中字尾...