• <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久久久久久麻豆| 国产精品VIDEOSSEX久久发布 | 久久综合久久综合久久综合| 久久精品国产免费一区| 久久99国产精品成人欧美| 久久久久亚洲AV无码专区首JN| 亚洲午夜久久久久妓女影院| 婷婷综合久久狠狠色99h| 麻豆久久久9性大片| 2021国产成人精品久久| 伊人久久综合成人网| 欧美777精品久久久久网| 国产亚洲精久久久久久无码77777| 久久无码av三级| 人妻精品久久久久中文字幕一冢本 | 99久久婷婷国产一区二区| 中文字幕精品无码久久久久久3D日动漫 | 日韩欧美亚洲综合久久影院Ds| 久久精品无码午夜福利理论片| 久久久久亚洲AV成人网人人网站| 久久免费的精品国产V∧| 麻豆国内精品久久久久久| 亚洲综合精品香蕉久久网97| 久久久久亚洲AV成人片 | 日本道色综合久久影院| 久久久久人妻一区精品性色av| 亚洲国产综合久久天堂 | 色综合久久无码五十路人妻| 亚洲国产成人精品女人久久久 | 欧美国产成人久久精品| 国内精品伊人久久久久影院对白 | 色综合久久久久久久久五月| 久久这里都是精品| 久久久受www免费人成| 国产精品欧美久久久久无广告| 亚洲嫩草影院久久精品| 久久香蕉综合色一综合色88| 69国产成人综合久久精品| A狠狠久久蜜臀婷色中文网| 国产亚洲婷婷香蕉久久精品| 91精品国产综合久久婷婷 |