• <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)

            隨筆檔案

            文章檔案

            搜索

            •  

            積分與排名

            • 積分 - 179335
            • 排名 - 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 閱讀(2233) 評論(1)  編輯 收藏 引用

            FeedBack:
            # re: 字典樹(講解+模版)[未登錄] 2013-02-18 19:15 ming
            在真實的狀態當中,其實是能夠讓自己從發展的主題當中尋找到屬于自己的發展軌跡的效果層次,計算機能夠在真實的反映一些發展效果的主題,而那種手機有能夠紀錄自己存在狀態的真實反映。  回復  更多評論
              
            伊色综合久久之综合久久| 热综合一本伊人久久精品 | 亚洲愉拍99热成人精品热久久 | 婷婷久久香蕉五月综合加勒比| 99久久无色码中文字幕人妻| 久久久久亚洲Av无码专| 91麻豆精品国产91久久久久久| 久久久久亚洲av毛片大| 久久国产AVJUST麻豆| 好久久免费视频高清| 人妻丰满?V无码久久不卡| 久久精品国产久精国产思思| 久久天天躁狠狠躁夜夜不卡| 影音先锋女人AV鲁色资源网久久 | 久久亚洲国产成人影院网站 | 免费无码国产欧美久久18| 国内精品久久久久久久97牛牛| 久久99国产一区二区三区| 一本久道久久综合狠狠爱| 久久久精品国产Sm最大网站| 国产精品久久久亚洲| 色综合久久中文字幕综合网| 99久久婷婷国产一区二区| 人妻无码αv中文字幕久久琪琪布| 亚洲国产精品久久久久网站| 乱亲女H秽乱长久久久| 久久久无码精品午夜| 国产精品一久久香蕉国产线看| 亚洲国产精品无码久久久不卡| 伊人丁香狠狠色综合久久| 久久人人爽人人爽人人片AV不| 亚洲精品99久久久久中文字幕| 久久精品国产99久久久香蕉| 91精品国产高清久久久久久91 | 女人高潮久久久叫人喷水| 99久久国产热无码精品免费久久久久| 99久久精品午夜一区二区| 久久w5ww成w人免费| 91久久精品91久久性色| 久久99热狠狠色精品一区| 国产 亚洲 欧美 另类 久久 |