• <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>
            隨筆 - 70  文章 - 160  trackbacks - 0

            公告:
            知識共享許可協議
            本博客采用知識共享署名 2.5 中國大陸許可協議進行許可。本博客版權歸作者所有,歡迎轉載,但未經作者同意不得隨機刪除文章任何內容,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 具體操作方式可參考此處。如您有任何疑問或者授權方面的協商,請給我留言。

            常用鏈接

            留言簿(8)

            隨筆檔案

            文章檔案

            搜索

            •  

            積分與排名

            • 積分 - 179013
            • 排名 - 147

            最新評論

            閱讀排行榜

            評論排行榜

             

            又稱單詞查找樹Trie樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用于統計,排序和保存大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統用于文本詞頻統計。它的優點是:利用字符串的公共前綴來節約存儲空間,最大限度地減少無謂的字符串比較,查詢效率比哈希表高。 

            字典樹與字典很相似,當你要查一個單詞是不是在字典樹中,首先看單詞的第一個字母是不是在字典的第一層,如果不在,說明字典樹里沒有該單詞,如果在就在該字母的孩子節點里找是不是有單詞的第二個字母,沒有說明沒有該單詞,有的話用同樣的方法繼續查找.字典樹不僅可以用來儲存字母,也可以儲存數字等其它數據。


            Trie的數據結構定義:
            #define MAX 26
            typedef 
            struct Trie   
            {   
                Trie 
            *
            next[MAX];   
                
            int v;   //根據需要變化

            };   
             
            Trie 
            *root;

            next是表示每層有多少種類的數,如果只是小寫字母,則26即可,若改為大小寫字母,則是52,若再加上數字,則是62了,這里根據題意來確定。
            v可以表示一個字典樹到此有多少相同前綴的數目,這里根據需要應當學會自由變化。

            Trie的查找(最主要的操作):
            (1) 每次從根結點開始一次搜索;
            (2) 取得要查找關鍵詞的第一個字母,并根據該字母選擇對應的子樹并轉到該子樹繼續進行檢索;   (3) 在相應的子樹上,取得要查找關鍵詞的第二個字母,并進一步選擇對應的子樹進行檢索。   
            (4) 迭代過程……   
            (5) 在某個結點處,關鍵詞的所有字母已被取出,則讀取附在該結點上的信息,即完成查找。

            這里給出生成字典樹和查找的版:

            生成字典樹:

            void createTrie(char *str)
            {
                
            int len = strlen(str);
                Trie 
            *= root, *q;
                
            for(int i=0; i<len; ++i)
                {
                    
            int id = str[i]-'0';
                    
            if(p->next[id] == NULL)
                    {
                        q 
            = (Trie *)malloc(sizeof(Trie));
                        q
            ->= 1;    //初始v==1
                        for(int j=0; j<MAX; ++j)
                            q
            ->next[j] = NULL;
                        p
            ->next[id] = q;
                        p 
            = p->next[id];
                    }
                    
            else
                    {
                        p
            ->next[id]->v++;
                        p 
            = p->next[id];
                    }
                }
                p
            ->= -1;   //若為結尾,則將v改成-1表示
            }

            接下來是查找的過程了:

            int findTrie(char *str)
            {
                
            int len = strlen(str);
                Trie 
            *= root;
                
            for(int i=0; i<len; ++i)
                {
                    
            int id = str[i]-'0';
                    p 
            = p->next[id];
                    
            if(p == NULL)   //若為空集,表示不存以此為前綴的串
                        return 0;
                    
            if(p->== -1)   //字符集中已有串是此串的前綴
                        return -1;
                }
                
            return -1;   //此串是字符集中某串的前綴
            }
            對于上述動態字典樹,有時會超內存,比如 HDOJ 1671 Phone List,這是就要記得釋放空間了:
            int dealTrie(Trie* T)
            {
                
            int i;
                
            if(T==NULL)
                    
            return 0;
                
            for(i=0;i<MAX;i++)
                {
                    
            if(T->next[i]!=NULL)
                        deal(T
            ->next[i]);
                }
                free(T);
                
            return 0;
            }

            題目分析+解答報告:

            HDOJ 1251 統計難題:
            http://www.wutianqi.com/?p=1364

            HDOJ 1671 Phone List
            http://www.wutianqi.com/?p=1366

            這里還有幾個字典樹的相關資料,我上傳了RaySource里了,順便和大家分享下:

            算法合集之《淺析字母樹在信息學競賽中的應用》

            字典樹

            posted on 2010-09-24 09:17 Tanky Woo 閱讀(2228) 評論(1)  編輯 收藏 引用

            FeedBack:
            # re: 字典樹(講解+模版)[未登錄] 2013-02-18 19:15 ming
            在真實的狀態當中,其實是能夠讓自己從發展的主題當中尋找到屬于自己的發展軌跡的效果層次,計算機能夠在真實的反映一些發展效果的主題,而那種手機有能夠紀錄自己存在狀態的真實反映。  回復  更多評論
              
            麻豆精品久久久久久久99蜜桃| 久久精品国产亚洲网站| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久亚洲精品无码AV红樱桃| 久久精品人人做人人妻人人玩| 99久久777色| 伊人伊成久久人综合网777| 久久久无码精品亚洲日韩蜜臀浪潮 | 久久久久亚洲爆乳少妇无| 久久SE精品一区二区| 亚洲国产精品久久久久| 亚洲色欲久久久综合网| 国产精品激情综合久久| 久久久久久久97| 伊人情人综合成人久久网小说| 国产精品久久久久久久| 亚洲精品乱码久久久久久久久久久久 | 亚洲综合精品香蕉久久网97| 老男人久久青草av高清| 亚洲国产精品婷婷久久| 久久精品中文字幕无码绿巨人| 久久亚洲日韩看片无码| 麻豆久久| 久久国产精品国语对白| 中文字幕亚洲综合久久| 久久精品国产精品亚洲精品| 久久久久久人妻无码| 久久国语露脸国产精品电影| 午夜精品久久久久成人| 久久国产精品波多野结衣AV| 99热精品久久只有精品| 国产福利电影一区二区三区久久久久成人精品综合 | 熟妇人妻久久中文字幕| 亚洲伊人久久成综合人影院| 午夜视频久久久久一区| 亚洲国产精品成人久久蜜臀 | 亚洲国产精品无码久久九九| 狠狠色综合网站久久久久久久| 91久久精品国产91性色也| 欧美精品一本久久男人的天堂| 久久99国产综合精品|