Trie樹的實現

2021-06-08 06:45:32 字數 2794 閱讀 1253

一、定義:

trie,又稱字典樹,是一種用於快速檢索的二十六叉樹結構。典型的空間換時間

二、結構圖:

三、原理:

特別地:和二叉查詢樹不同,在trie樹中,每個結點上並非儲存乙個元素。

四、性質:

0、利用串的公共字首,節約記憶體

1、在trie樹上進行檢索總是始於根結點

2、根節點不包含字元,除根節點外的每乙個節點都只代表乙個字母,這裡不是包含。

3、從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串。

4、每個節點的所有子節點包含的字元都不相同。

五、效率分析

0、當儲存大量字串時,trie耗費的空間較少。因為鍵值並非顯式儲存的,而是與其他鍵值共享子串。

1、查詢快。在trie樹中查詢乙個關鍵字的時間和樹中包含的結點數

無關,而取決於組成關鍵字的字元數。對於長度為m的鍵值,最壞情況下只需花費o(m)的時間(對比:二叉查詢樹的查詢時間和樹中的結點數有關o(log2n)。)

2、如果要查詢的關鍵字可以分解成字串行且不是很長,利用trie樹查詢速度優於二叉查詢樹。

3、若關鍵字長度最大是5,則利用trie樹,利用5次比較可以從265=11881376個可能的關鍵字中檢索出指定的關鍵字。而利用二叉查詢樹至少要進行log2265=23.5次比較。

六、應用:用於字串的統計與排序,經常被搜尋引擎系統用於文字詞頻統計。

1、字典樹在串的快速檢索中的應用。

給出n個單詞組成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最早出現的順序寫出所有不在熟詞表中的生詞。在這道題中,我們可以用字典樹,先把熟詞建一棵樹,然後讀入文章進行比較,這種方法效率是比較高的。

2、字典樹在「串」排序方面的應用

給定n個互不相同的僅由乙個單詞構成的英文名,讓你將他們按字典序從小到大輸出用字典樹進行排序,採用陣列的方式建立字典樹,這棵樹的每個結點的所有兒子很顯然地按照其字母大小排序。對這棵樹進行先序遍歷即可。

3.、字典樹在最長公共字首問題的應用

對所有串建立字典樹,對於兩個串的最長公共字首的長度即他們所在的結點的公共祖先個數,於是,問題就轉化為最近公共祖先問題。 **

#ifndef _trie_

#define _trie_

#include #include #include #include #include using namespace std;

const int maxbranchnum = 26;//如果區分大小寫,可以擴充套件到52

/*定義trie樹結點*/

class trienode

};/*定義類trie*/

class trie

;#endif //_trie_

trie::trie()

trie::~trie()

/*插入乙個單詞*/

void trie::insert(const char* str)

if (null == ploc->nextbranch[index])//該單詞的字首不存在,要生成該結點

ploc = ploc->nextbranch[index];

} if (null != ploc->word)//單詞已經出現過

else //單詞沒有出現過,應該插入單詞 }

/*查詢乙個單詞,如果存在該單詞,則返回其出現次數*/

bool trie::search(const char* str,int& count)

ploc = ploc->nextbranch[index];

str++;

} if (ploc && ploc->word)//條件成立,找到該單詞

return false;

}bool trie::remove(const char* str)

ploc = ploc->nextbranch[index];

str++;

} if (ploc && ploc-> word)//條件成立,找到該單詞

return false;

}void trie::printall()

void trie::printpre(const char* str)

ploc = ploc->nextbranch[index];

str++;

} if (ploc)//條件成立,找到該單詞 }

/*按照字典順序輸出以proot為根的所有的單詞*/

void trie::print(trienode* proot)

//輸出單詞

if (null != proot->word) }

/*銷毀trie樹*/

void trie::destory(trienode* proot)

for (int i = 0;i < maxbranchnum;i++)

//銷毀單詞占得空間

if (null != proot->word)

delete proot;//銷毀結點

proot = null;

}int main()

//查詢

bool isfind = t.search("the",count);

if (isfind)

{ cout<

Trie樹(字典樹)的實現

trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表高。trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的...

Trie樹的C 實現

先給出lintcode的題目 實現trie樹 trie樹的一般性質如下 1.根節點不包含字元,除根節點外每乙個節點都只包含乙個字元。2.從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串。3.每個節點的所有子節點包含的字元都不相同。那麼既然是樹,既然需要和字串匹配,那麼樹的節點怎麼定義...

Trie樹的C 實現

先給出lintcode的題目 實現trie樹 trie樹就是字典樹,用在搜尋引擎如搜尋詞條,還比如說之前dns網域名稱解析系統搜尋根據網域名稱搜尋ip。總之,是棵樹,根據字串搜尋某一節點,同時就可獲得節點儲存的資訊了。trie樹的一般性質如下 1.根節點不包含字元,除根節點外每乙個節點都只包含乙個字...