Trie树既可用于一般的字典搜索,也可用于索引查找。对于给定的一个字符串a1,a2,a3,...,an.则 采用TRIE树搜索经过n次搜索即可完成一次查找。不过好像还是没有B树的搜索效率高,B树搜索算法复杂度为logt(n+1/2).当t趋向大,搜索效率变得高效。怪不得DB2的访问内存设置为虚拟内存的一个PAGE大小,而且帧切换频率降低,无需经常的PAGE切换。 // trie.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <stdio.h> #include <iostream> //#include <ciostream.h> #include <string.h> using namespace std; const int num_chars = 26; class Trie { public: Trie(); Trie(Trie& tr); virtual ~Trie(); int trie_search(const char* word, char* entry ) const; int insert(const char* word, const char* entry); int remove(const char* word, char* entry); protected: struct Trie_node { char* data; Trie_node* branch[num_chars]; Trie_node(); }; Trie_node* root; }; Trie::Trie_node::Trie_node() { data = NULL; for (int i=0; i<num_chars; ++i) branch[i] = NULL; } Trie::Trie():root(NULL) { } Trie::~Trie() { } int Trie::trie_search(const char* word, char* entry ) const { int position = 0; char char_code; Trie_node *location = root; while( location!=NULL && *word!=0 ) { if (*word>='A' && *word<='Z') char_code = *word-'A'; else if (*word>='a' && *word<='z') char_code = *word-'a'; else return 0; location = location->branch[char_code]; position++; word++; } if ( location != NULL && location->data != NULL ) { strcpy(entry,location->data); return 1; } else return 0; } int Trie::insert(const char* word, const char* entry) { int result = 1, position = 0; if ( root == NULL ) root = new Trie_node; char char_code; Trie_node *location = root; while( location!=NULL && *word!=0 ) { if (*word>='A' && *word<='Z') char_code = *word-'A'; else if (*word>='a' && *word<='z') char_code = *word-'a'; else return 0; if( location->branch[char_code] == NULL ) location->branch[char_code] = new Trie_node; location = location->branch[char_code]; position++; word++; } if (location->data != NULL) result = 0; else { location->data = new char[strlen(entry)+1]; strcpy(location->data, entry); } return result; } int main() { Trie t; char entry[100]; t.insert("aa", "DET"); t.insert("abacus","NOUN"); t.insert("abalone","NOUN"); t.insert("abandon","VERB"); t.insert("abandoned","ADJ"); t.insert("abashed","ADJ"); t.insert("abate","VERB"); t.insert("this", "PRON"); if (t.trie_search("this", entry)) cout<<"'this' was found. pos: "<<entry<<endl; if (t.trie_search("abate", entry)) cout<<"'abate' is found. pos: "<<entry<<endl; if (t.trie_search("baby", entry)) cout<<"'baby' is found. pos: "<<entry<<endl; else cout<<"'baby' does not exist at all!"<<endl; if (t.trie_search("aa", entry)) cout<<"'aa was found. pos: "<<entry<<endl; }