青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

ACM___________________________

______________白白の屋
posts - 182, comments - 102, trackbacks - 0, articles - 0
<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(24)

隨筆分類(332)

隨筆檔案(182)

FRIENDS

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

trie樹--詳解

Posted on 2010-10-23 22:05 MiYu 閱讀(1546) 評論(0)  編輯 收藏 引用 所屬分類: ACM_資料ACM ( 字典樹( TRIE ) )

MiYu原創, 轉帖請注明 : 轉載自 ______________白白の屋    

 

文章作者:yx_th000 文章來源:Cherish_yimi (http://www.cnblogs.com/cherish_yimi/) 轉載請注明,謝謝合作。
關鍵詞:trie trie樹 數據結構

    前幾天學習了并查集和trie樹,這里總結一下trie。
    本文討論一棵最簡單的trie樹,基于英文26個字母組成的字符串,討論插入字符串、判斷前綴是否存在、查找字符串等基本操作;至于trie樹的刪除單個節點實在是少見,故在此不做詳解。

l        Trie原理

Trie的核心思想是空間換時間。利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。

l        Trie性質

好多人說trie的根節點不包含任何字符信息,我所習慣的trie根節點卻是包含信息的,而且認為這樣也方便,下面說一下它的性質 (基于本文所討論的簡單trie樹)

1.    字符的種數決定每個節點的出度,即branch數組(空間換時間思想)

2.    branch數組的下標代表字符相對于a的相對位置

3.    采用標記的方法確定是否為字符串。

4.    插入、查找的復雜度均為O(len),len為字符串長度

l        Trie的示意圖

如圖所示,該trie樹存有abc、d、da、dda四個字符串,如果是字符串會在節點的尾部進行標記。沒有后續字符的branch分支指向NULL





l        
Trie
Trie的優點舉例

已知n個由小寫字母構成的平均長度為10的單詞,判斷其中是否存在某個串為另一個串的前綴子串。下面對比3種方法:

1.    最容易想到的:即從字符串集中從頭往后搜,看每個字符串是否為字符串集中某個字符串的前綴,復雜度為O(n^2)。

2.    使用hash:我們用hash存下所有字符串的所有的前綴子串。建立存有子串hash的復雜度為O(n*len)。查詢的復雜度為O(n)* O(1)= O(n)。

3.    使用trie:因為當查詢如字符串abc是否為某個字符串的前綴時,顯然以b,c,d....等不是以a開頭的字符串就不用查找了。所以建立trie的復雜度為O(n*len),而建立+查詢在trie中是可以同時執行的,建立的過程也就可以成為查詢的過程,hash就不能實現這個功能。所以總的復雜度為O(n*len),實際查詢的復雜度只是O(len)。


解釋一下hash為什么不能將建立與查詢同時執行,例如有串:911,911456輸入,如果要同時執行建立與查詢,過程就是查詢911,沒有,然后存入9、91、911,查詢911456,沒有然后存入9114、91145、911456,而程序沒有記憶功能,并不知道911在輸入數據中出現過。所以用hash必須先存入所有子串,然后for循環查詢。

而trie樹便可以,存入911后,已經記錄911為出現的字符串,在存入911456的過程中就能發現而輸出答案;倒過來亦可以,先存入911456,在存入911時,當指針指向最后一個1時,程序會發現這個1已經存在,說明911必定是某個字符串的前綴,該思想是我在做pku上的3630中發現的,詳見本文配套的“入門練習”。

l        Trie的簡單實現(插入、查詢)


 1
 2#include <iostream>
 3using namespace std;
 4
 5const int branchNum = 26//聲明常量 
 6int i;
 7
 8struct Trie_node
 9{
10    bool isStr; //記錄此處是否構成一個串。
11    Trie_node *next[branchNum];//指向各個子樹的指針,下標0-25代表26字符
12    Trie_node():isStr(false)
13    {
14        memset(next,NULL,sizeof(next));
15    }

16}
;
17
18class Trie
19{
20public:
21    Trie();
22    void insert(const char* word);
23    bool search(char* word); 
24    void deleteTrie(Trie_node *root);
25private:
26    Trie_node* root;
27}
;
28
29Trie::Trie()
30{
31    root = new Trie_node();
32}

33
34void Trie::insert(const char* word)
35{
36    Trie_node *location = root;
37    while(*word)
38    {
39        if(location->next[*word-'a'== NULL)//不存在則建立
40        {
41            Trie_node *tmp = new Trie_node();
42            location->next[*word-'a'= tmp;
43        }
    
44        location = location->next[*word-'a']; //每插入一步,相當于有一個新串經過,指針要向下移動
45        word++;
46    }

47    location->isStr = true//到達尾部,標記一個串
48}

49
50bool Trie::search(char *word)
51{
52    Trie_node *location = root;
53    while(*word && location)
54    {
55        location = location->next[*word-'a'];
56        word++;
57    }

58    return(location!=NULL && location->isStr);
59}

60
61void Trie::deleteTrie(Trie_node *root)
62{
63    for(i = 0; i < branchNum; i++)
64    {
65        if(root->next[i] != NULL)
66        {
67            deleteTrie(root->next[i]);
68        }

69    }

70    delete root;
71}

72
73void main() //簡單測試
74{
75    Trie t;
76    t.insert("a");         
77    t.insert("abandon");
78    char * c = "abandoned";
79    t.insert(c);
80    t.insert("abashed");
81    if(t.search("abashed"))
82        printf("true\n");
83}

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久婷婷丁香| 夜夜爽www精品| 国产精品www.| 欧美成人一区二区三区片免费| 亚洲欧美日韩精品久久亚洲区| 亚洲国产精品一区制服丝袜| 欧美在线关看| 亚洲一区二区三区精品在线| 影音欧美亚洲| 国产欧美精品日韩区二区麻豆天美| 欧美成人在线影院| 久久久另类综合| 午夜亚洲激情| 午夜精品福利一区二区三区av | 亚洲欧美国产精品va在线观看| 亚洲国产精品一区在线观看不卡| 久久这里有精品15一区二区三区 | 欧美一级片久久久久久久| 亚洲免费观看| 亚洲三级国产| 亚洲国内自拍| 亚洲高清不卡av| 欧美激情1区2区3区| 噜噜噜91成人网| 久热国产精品| 久久一区二区三区国产精品| 久久国产视频网| 久久国内精品视频| 久久精品国产999大香线蕉| 亚洲欧美日本伦理| 午夜精品在线| 午夜在线精品| 久久av二区| 久久精品国产综合| 久久久久久久久久码影片| 久久国产免费看| 久久精品人人做人人爽电影蜜月 | 国产日产欧美精品| 国产精品久久久久久久久久直播| 欧美视频久久| 国产精品久久久久一区二区三区 | 亚洲精品视频免费| 夜夜嗨av一区二区三区网页| 艳女tv在线观看国产一区| 亚洲美女精品久久| 亚洲天堂av高清| 亚洲欧美日韩专区| 久久久久99| 蜜桃久久av| 亚洲国产精品成人| 日韩视频精品在线| 亚洲特级片在线| 欧美一区1区三区3区公司| 欧美一区日韩一区| 六月天综合网| 欧美日韩成人综合天天影院| 国产精品入口| 狠狠色丁香久久婷婷综合_中| 在线观看国产欧美| 一本色道久久加勒比精品| 亚洲综合99| 久久综合给合久久狠狠色| 欧美激情片在线观看| 亚洲精品国精品久久99热一| 亚洲视频在线一区| 久久久欧美一区二区| 欧美区在线播放| 国产精品亚洲一区| 狠狠色狠狠色综合系列| 亚洲蜜桃精久久久久久久| 午夜精品久久久久久99热| 久久五月天婷婷| 99精品免费| 久久经典综合| 欧美日韩1区| 国产一区二区你懂的| 亚洲精品综合| 欧美永久精品| 亚洲激情偷拍| 欧美一区二视频在线免费观看| 欧美黄色一区| 国产一区二区三区黄| 99re这里只有精品6| 久久精品国产99国产精品| 亚洲激情自拍| 久久都是精品| 国产精品久久久久久久久| 亚洲国产成人久久综合一区| 亚洲综合色丁香婷婷六月图片| 免费毛片一区二区三区久久久| 亚洲婷婷综合色高清在线| 久久日韩精品| 国产欧美日韩亚州综合| 亚洲免费观看高清完整版在线观看熊 | 亚洲国产精品一区二区第四页av| 午夜久久久久久| 亚洲激精日韩激精欧美精品| 久久成人精品| 国产精品久久久久久久久免费 | 一区二区视频免费在线观看| 亚洲性图久久| 亚洲国产精品成人va在线观看| 欧美综合国产| 国产精品人人做人人爽| 一本综合久久| 亚洲品质自拍| 欧美大片一区二区三区| 精品动漫一区二区| 久久国产精品网站| 亚洲夜间福利| 欧美三级欧美一级| 亚洲精选在线观看| 欧美xx视频| 久久久久综合| 揄拍成人国产精品视频| 久久精品国产亚洲aⅴ| 亚洲影院色在线观看免费| 欧美天天影院| 亚洲在线不卡| 99精品福利视频| 欧美日韩久久久久久| 亚洲精选久久| 亚洲人成网站在线观看播放| 欧美黑人一区二区三区| 亚洲国产小视频| 欧美黄色大片网站| 久久综合中文| 亚洲日本无吗高清不卡| 欧美福利一区二区三区| 免费美女久久99| 伊人久久婷婷色综合98网| 久热精品在线| 久久亚洲图片| 91久久国产自产拍夜夜嗨| 亚洲国产另类久久精品| 欧美久久久久免费| 一区二区三区高清在线观看| 日韩一级裸体免费视频| 国产精品高潮呻吟久久av无限| 亚洲欧美网站| 午夜亚洲视频| 在线日韩av| 亚洲经典在线| 欧美午夜剧场| 久久国内精品视频| 久久久久亚洲综合| 亚洲精品一区在线观看| 日韩亚洲欧美中文三级| 国产精品一区二区在线观看| 久久久精品一区| 欧美www视频| 亚洲一区二区免费| 亚洲欧美亚洲| 在线精品观看| 亚洲精品久久久久久久久久久久久| 欧美日韩一区二区高清| 欧美一区二区精品在线| 久久精品国产亚洲一区二区| 亚洲国产日本| 99精品国产在热久久婷婷| 国产日韩欧美在线播放不卡| 久久综合五月| 欧美日韩999| 久久久999精品免费| 老司机免费视频一区二区三区| 日韩亚洲精品在线| 亚洲欧美成人| 亚洲高清久久网| 亚洲视频在线一区| 在线成人免费观看| 亚洲美女在线观看| 国产一区二区精品丝袜| 最新日韩在线| 黑人一区二区三区四区五区| 亚洲精品久久久久久下一站| 国产偷国产偷亚洲高清97cao| 欧美二区在线播放| 国产精品日本一区二区| 欧美国产激情二区三区| 国产精品久久久久久久app| 欧美jizz19性欧美| 国产精品三区www17con| 亚洲国产精品一区在线观看不卡| 国产精品亚洲综合天堂夜夜| 欧美成人免费全部| 国产伦精品一区二区三区四区免费| 欧美国产精品久久| 国产女人精品视频| 亚洲欧洲午夜| 1024成人网色www| 亚洲一区二区三区免费在线观看| 亚洲成人在线免费| 亚洲女性裸体视频| 中文在线资源观看视频网站免费不卡| 久久av老司机精品网站导航| 亚洲午夜视频| 欧美精品一区二区蜜臀亚洲| 美女精品在线| 国产一区二区视频在线观看| 这里只有精品电影|