空間優化的字典樹

2021-07-22 13:46:58 字數 994 閱讀 1099

字典樹空間優化

如果字典樹要儲存的字串的字符集比較大,(比如全部的字元),甚至可能有多位元組字元。這是我們給每個節點256個子節點嗎? 用平衡樹(或map)犧牲時間來換取空間嗎?

不,可以進行這樣的優化: 我們考慮把乙個8位的char,拆開變成2個4位的資料,依次加入字典樹。顯然4位最大值也只是2^4-1=15,每個節點只需要16個子節點。 當然這樣做相當於字串長度len *= 2,時間*= 2。但是如果原先需要的空間為m,這樣優化後的空間只需要2*sqrt(m),大幅度減小了空間占用。而時間並沒增大很多。

下面給出乙份實現**

#ifndef trie_h

#define trie_h

#include

#include

#include

#include

#include "basedef.h"

#define next_size 16

typedef

struct trienodetype

trienode, *ptrienode;

typedef

struct trietype

trie;

void inittrie(trie *t)

if(!d -> next[t])

return d -> next[t];

}void insertword(trie *t, char *w, int len)

fw -> isfinal = true;

}bool existword(trie *t, char *w, int len)

return fw -> isfinal;

}void destroytrienodes(ptrienode d)

void destroytrie(trie *t)

#endif

用雜湊演算法優化字典樹空間結構

字典樹是字首匹配問題中常用的資料結構,查詢速度可以達到o len len為待查序列的長度,但是字典樹的空間消耗非常大,對於基於字母表的英文單詞,每個節點要儲存26個指標指向下一節點,很有可能有不少空的,很浪費。考慮在節點中用雜湊表來儲存子節點指標,鍵值為單個字母,這樣對於模式中沒有的字母就省掉了空指...

hdu 6183 線段樹的空間優化

題意 乙個空的座標系,有 種操作 1 x y c表示在 x,y 點染上顏色c 2 x y1 y2表示查詢在 1,y1 到 x,y2 範圍內有多少種不同的顏色 0表示清屏 3表示程式退出 0 x,y 1000000,0 c 50 思路 開五十個線段樹 一種顏色乙個 以y為下表,儲存min x,因為查詢...

LDUOJ 字首(字典樹的鍊錶優化)

原題鏈結 description 給你乙個字串集合,請從中找出一些字串,使得找出來的這些字串的最長公共字首與字串數的總個數的乘積最大化,並輸出這個最大值。input 輸入檔案的第一行給出字串個數n 1 n 1000000 下面n行描述這n個字串,每個字串長度不超過20000,輸入檔案大小在10mb之...