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

            隨筆檔案

            文章檔案

            搜索

            •  

            積分與排名

            • 積分 - 179334
            • 排名 - 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
            在真實的狀態當中,其實是能夠讓自己從發展的主題當中尋找到屬于自己的發展軌跡的效果層次,計算機能夠在真實的反映一些發展效果的主題,而那種手機有能夠紀錄自己存在狀態的真實反映。  回復  更多評論
              
            亚洲国产精品无码久久久不卡| 精品熟女少妇AV免费久久| 久久综合狠狠综合久久综合88| 狠狠色婷婷久久一区二区| 久久精品无码专区免费青青| 色综合久久88色综合天天| 久久亚洲高清综合| 国内精品伊人久久久久777| 精品亚洲综合久久中文字幕| 久久久久国产日韩精品网站| 狠狠色婷婷久久一区二区| 婷婷久久综合九色综合98| 久久久久亚洲爆乳少妇无| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 亚洲日韩中文无码久久| 国产福利电影一区二区三区久久久久成人精品综合 | 国产精品对白刺激久久久| 精品免费久久久久国产一区| 无码人妻久久一区二区三区 | 99久久无色码中文字幕| 亚洲AⅤ优女AV综合久久久| 精品久久久久久久无码 | 一本久久久久久久| 伊人色综合久久天天人手人婷 | 国产成人无码精品久久久性色 | 亚洲国产欧美国产综合久久| 91久久香蕉国产熟女线看| 久久影院综合精品| 色诱久久av| 亚洲国产一成久久精品国产成人综合| 无码人妻少妇久久中文字幕蜜桃| 青青久久精品国产免费看| 99国内精品久久久久久久| 国内精品久久久久影院优| 欧美午夜精品久久久久免费视| 亚洲中文字幕伊人久久无码| 久久久久亚洲?V成人无码| 久久精品国产一区二区电影| 久久久久国产一区二区| 久久久久久毛片免费看| 久久久久一本毛久久久|