大家都知道,trie樹(又稱字典樹)是一種樹型資料結構,用於儲存大量的字串。它的優點是:利用字串的公共字首來節約儲存空間。
相對來說,trie樹是一種比較簡單的資料結構,比較易於理解。話說上帝是公平的,簡單的東西是要付出相應的代價的!trie樹也有它的缺點,它的記憶體消耗非常大。下面介紹乙個減小記憶體消耗的小技巧。
我們先看看這個題目:
看看這段程式:
#include<
stdio.h
>
#include
<
string
.h>
#include
<
malloc.h
>
typedef
struct
node
node;
inttmp;
node
*newnode()
void
insert(node
*root,
chars)p
->
flag =1
;}void
search(node
*root,
char
s)if
(p->
flag)
}void
change(
char
s)int
main()
while
(m--
)printf(
"%d\n
", tmp);
}return0;
}
這是乙個典型的trie樹程式,ac的結果是:
160138
vongang
1500
accepted
50376k
312ms
gcc顯然,memory很**!
從上邊程式可以看到。root 在while
(scanf("%d
", &n),n)裡邊初始化,當一次while
(scanf("%d
", &n),n)執行完以後,第二次又會給root重新分配空間。這樣,原來分配的空間就沒有用處了,於是,我們可以在一次程式執行完以後,將root的空間free掉。當然不是簡單的free(root),這裡需要乙個del()函式,**如下:
voiddel(node *p)
free(p);p =
null;
}
在while
(scanf("%d
", &n),n){}的最後呼叫del()函式可以大大減小記憶體消耗, ac結果:
160137
vongang
1500
accepted
12680k
500ms
gccmemory從5w縮小到1w多,當然,時間有所增加,這也算是del()函式的一點缺陷吧。另為,此方法只適用於動態分配儲存空間!
靜態分布記憶體儲存trie樹
以poj3630,hdu1671為例,若用動態分布記憶體,在hdu就能過,time為312ms,memory為3712k 但在poj為tle 若用靜態分布記憶體,在poj 上的time為141ms,memory為2876k 在hdu上time為62ms,memory為2720k 靜態記憶體 如下 p...
Trie樹(字典樹)
trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...
字典樹 Trie樹
字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...