關於字典樹節點數組大小問題

問題描述

對於分支數爲ww的字典樹(前綴樹),插入nn個字符串,每個字符串長度最大mm,那麼字典樹節點數組需要開多大合適?(使用靜態開闢空間,排除vector等動態開闢空間的方法)

結論

k=logwnk=\lfloor log_{w}n \rfloor,那麼數組大小totle=w(wk1)/(w1)+(mk)nw(n1)w1+(mk)ntotle=w(w^k-1)/(w-1)+(m-k)*n \le \frac {w*(n-1)}{w-1}+(m-k)*n

這個可能有些複雜, 我們開數組大小一般也不會這樣再計算一下。

其實一般我們把數組大小開到mnm*n個即可,顯而易見這個大小是足夠的,假設在最壞的情況下,我們再壞一些,這些字符串的每個前綴都不同,那麼都佔用一個節點,這樣的不同的前綴的個數是mnm*n(但是都不會這麼大)。

證明

我們的數組大小必須能夠在最壞情況下足夠使用。最壞情況下我們假設每個字符串的長度都是最長的m,因爲兩個前綴相重複的越多,那麼就會省下的空間就越多,所以我們儘量讓這些字符串的前綴不同。

因爲有n個字符串,假設這n個字符串都不相同,那麼形成的字典樹葉子節點的個數就是n。

最壞情況下,我們形成的字典樹會有這樣一個特徵:存在一個深度k,使得深度[1,k][1,k] 的都是滿叉(根節點的深度是0),且深度[k+1,m][k+1,m]中每層的節點數量都是nn。(因爲長度爲xx情況下,不同的前綴數量最多爲min(n,wx)min(n,w^x)個)

不難理解kk是滿足條件wknw^k\le n下的最大值,故k=logwnk=\lfloor log_{w}n \rfloor,故總結點數量totle=w+w2..+wk+(mk)ntotle=w+w^2..+w^k+(m-k)*n

化簡可得

totle=w(wk1)/(w1)+(mk)nw(n1)w1+(mk)ntotle=w(w^k-1)/(w-1)+(m-k)*n \le \frac {w*(n-1)}{w-1}+(m-k)*n

發佈了342 篇原創文章 · 獲贊 74 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章