单词查找树,即trie树,又叫字典树或前缀树,是一种树型结构。用于统计,排序,保存大量的字符串,效率较高,主要是以空间换时间。
但我们遇到大量的字符串要进行存储,并且要在其中查找某些字符串时,如果用一般数组保存从头到尾扫一遍要O(n)的时间效率,显然这不够好,因为我们多比较了许多无用的字符串, 如果我们能根据字符串前缀排除一些字符串,又可以节省许多时间,这就需要单词查找树。
单词查找树思想类似于英文字典,根据单词第一个字符进行分类,放在不同的子树中,在根据下一个字符进行分类,放在不同子树中......这就相当于形成了一个二十六叉树,当我们查找某个字符串时从根节点(无字符)出发,如果子树中有该字符串的这一位字符,则查该子树,直到查到叶节点,看是否与待查字符串对应,然后根据结果输出即可,时间效率为O(length(s)),length(s)为字符串长度。
增加节点操作
procedure done(var x:longint); var i,j:longint; begin len:=len+1; x:=len; g[len]:=false; end;
插入
procedure put(s:string); var i,p,c:longint; begin p:=1; for i:=1 to length(s) do begin c:=ord(s[i])-96; if trie[p,c]=0 then done(trie[p,c]); p:=trie[p,c]; end; v[p]:=v[p]+1; end;
查找
function get(s:string):longint; var i,p,c:longint; begin p:=1; for i:=1 to length(s) do begin c:=ord(s[i])-96; p:=trie[p,c]; if p=0 then begin break; end; end; if (p>0)and(g[p]=false) then get:=v[p]; end;