Trie 樹記憶體消耗問題

2021-09-06 04:07:52 字數 1509 閱讀 8884

大家都知道,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()函式,**如下:

void

del(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樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...