Trie字典樹(前綴樹)

對字典樹的理解:

a.Trie字典樹又可以稱為前綴樹,是一種真正為字典設計的數(shù)據(jù)結構,其中的核心實現(xiàn)就包含了字典Map.
b.Trie專門用來處理字符串相關的問題,運行十分高效.其運算時的復雜度跟樹的規(guī)模無關,只跟用于操作的目標字符串W的長度L相關,即O(L).鑒于大部分的字符串長度一般都較短(10+的很少)即字典樹相對其他結構有著明顯更低的時間復雜度-->例如:一個100w規(guī)模的條目,即使使用樹結構,時間復雜度為logn級別,基本上為20,對比得到,在較大規(guī)模的數(shù)據(jù)背景下可以看出Trie字典樹的優(yōu)勢.
c.Trie樹的結構如圖1


圖1 Trie樹的結構原理

從結構圖中可以看出(1).Trie樹結構是由一個一個節(jié)點構成
(2).每個節(jié)點代表的是一個對應的字符
(3).每個節(jié)點上都掛載有子節(jié)點.

設計代碼:

設計思路:

從Trie樹的結構上看,Trie也是一個一個節(jié)點node相互掛接而成,并且每個節(jié)點都包含相應的變量var信息.到這里,可以發(fā)現(xiàn)Trie和鏈表LinkedList似乎是完全一樣.但進一步讀圖可以發(fā)現(xiàn)--->①Trie樹并非是二叉樹,而是多叉樹,并且不同的父親節(jié)點帶子節(jié)點的數(shù)量也是不定的,鏈表的父子節(jié)點則是一一鏈接的.②節(jié)點表達的信息是字符,每個節(jié)點Node和字符Chararter一一對應.
綜上所述的思路,可以將Trie設計為以Node節(jié)點為基本單元的數(shù)據(jù)結構,節(jié)點之間相互鏈接,節(jié)點相互多鏈接的屬性體現(xiàn)為節(jié)點掛載節(jié)點集合,又由于節(jié)點的字符和節(jié)點本身是一一對應,那么集合選擇為字典Map.

class Node{
                 public boolean isWord;
        public TreeMap<Character,Node> next;        
}
核心代碼實現(xiàn):
/**
 * class Trie
 * @author Administrator
 *
 */
import java.util.TreeMap;
public class Trie {
    /**
     * aim class --> connect each other
     * @author Administrator
     *
     */
    private class Node{
        public boolean isWord;
        // the TreeMap support generic
        public TreeMap<Character,Node> next;
        
        public Node(boolean isWord) {
            this.isWord = isWord;
            next = new TreeMap<>();
        }
        
        public Node() {
            this(false);
        }
    }
    private int size;
    private Node root;
    
    /**
     * constructor
     */
    public Trie() {
        size = 0;
        root = new Node();
    }
    
    public int getSize() {
        return size;
    }
    
    /**
     * add method-->add a new word into Trie tree
     * @param word
     */
    public void add(String word) {
        Node cur = root;
        for (int i = 0; i < word.length(); i++) {
            char c= word.charAt(i);
            if (cur.next.get(c) == null) {
                cur.next.put(c, new Node());
            }
            cur = cur.next.get(c);
        }
        
        if (!cur.isWord) {
            cur.isWord = true;
            size++;
        }   
    }
    
    /**
     * method contains --> determine whether the target String if in the Trie
     * @param word
     * @return
     */
    public boolean contains(String word) {
        Node cur = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (cur.next.get(c)==null) {
                return false;
            }
            cur = cur.next.get(c);
        }
        if (!cur.isWord) {
            cur.isWord = true;
        }
        return true;
    }
    
    public boolean isPrefix(String prefix) {
        Node cur = root;
        for (int i = 0; i < prefix.length(); i++) {
            char c = prefix.charAt(i);
            if (cur.next.get(c) == null) {
                return false;               
            }
            else {
                cur = cur.next.get(c);
            }
        }
        /**
         * determine if there are any words after the prefix
         */
        if (cur.next.keySet()!=null) {
            return true;    
        }
        else
            return false;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末查辩,一起剝皮案震驚了整個濱河市胀屿,隨后出現(xiàn)的幾起案子辉川,更是在濱河造成了極大的恐慌,老刑警劉巖杠愧,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨娜,死亡現(xiàn)場離奇詭異慎宾,居然都是意外死亡蒸矛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門闽颇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盾戴,“玉大人,你說我怎么就攤上這事兵多〖夥龋” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵剩膘,是天一觀的道長可婶。 經常有香客問我,道長援雇,這世上最難降的妖魔是什么矛渴? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮惫搏,結果婚禮上具温,老公的妹妹穿的比我還像新娘。我一直安慰自己筐赔,他們只是感情好铣猩,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茴丰,像睡著了一般达皿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贿肩,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天峦椰,我揣著相機與錄音,去河邊找鬼汰规。 笑死汤功,一個胖子當著我的面吹牛,可吹牛的內容都是我干的溜哮。 我是一名探鬼主播滔金,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茂嗓!你這毒婦竟也來了餐茵?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤述吸,失蹤者是張志新(化名)和其女友劉穎忿族,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肠阱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年票唆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屹徘。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡走趋,死狀恐怖,靈堂內的尸體忽然破棺而出噪伊,到底是詐尸還是另有隱情簿煌,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布鉴吹,位于F島的核電站姨伟,受9級特大地震影響,放射性物質發(fā)生泄漏豆励。R本人自食惡果不足惜夺荒,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望良蒸。 院中可真熱鬧技扼,春花似錦、人聲如沸嫩痰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽串纺。三九已至丽旅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纺棺,已是汗流浹背榄笙。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留五辽,地道東北人办斑。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓外恕,卻偏偏與公主長得像杆逗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鳞疲,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351