問題描述
對於分支數爲w的字典樹(前綴樹),插入n個字符串,每個字符串長度最大m,那麼字典樹節點數組需要開多大合適?(使用靜態開闢空間,排除vector等動態開闢空間的方法)
結論
令k=⌊logwn⌋,那麼數組大小totle=w(wk−1)/(w−1)+(m−k)∗n≤w−1w∗(n−1)+(m−k)∗n
這個可能有些複雜, 我們開數組大小一般也不會這樣再計算一下。
其實一般我們把數組大小開到m∗n個即可,顯而易見這個大小是足夠的,假設在最壞的情況下,我們再壞一些,這些字符串的每個前綴都不同,那麼都佔用一個節點,這樣的不同的前綴的個數是m∗n(但是都不會這麼大)。
證明
我們的數組大小必須能夠在最壞情況下足夠使用。最壞情況下我們假設每個字符串的長度都是最長的m,因爲兩個前綴相重複的越多,那麼就會省下的空間就越多,所以我們儘量讓這些字符串的前綴不同。
因爲有n個字符串,假設這n個字符串都不相同,那麼形成的字典樹葉子節點的個數就是n。
最壞情況下,我們形成的字典樹會有這樣一個特徵:存在一個深度k,使得深度[1,k] 的都是滿叉(根節點的深度是0),且深度[k+1,m]中每層的節點數量都是n。(因爲長度爲x情況下,不同的前綴數量最多爲min(n,wx)個)
不難理解k是滿足條件wk≤n下的最大值,故k=⌊logwn⌋,故總結點數量totle=w+w2..+wk+(m−k)∗n
化簡可得
totle=w(wk−1)/(w−1)+(m−k)∗n≤w−1w∗(n−1)+(m−k)∗n