Trie Tree的c++实现

问题描述:

1.Tire tree 是一种用来存储字符串的高效的数据结构。它的插入和查询的时间复杂度为O(string length)。用self balance tree 存储字符串的 时间复杂度为O(length(string)*lgN),N是树的节点树。Trie tree的查询和存储优势是很显然的;

2.它的缺点是树的存储空间变大,需要更多的内存;

3.它的每个节点会有多个孩子节点,同一节点下的孩子共享相同的前缀串(从根节点到父节点的字符串);

4.详细可见下图:

程序代码:

#ifndef _TRIE_TREE_H_
#define _TRIE_TREE_H_

#include <stdlib.h>
#include <assert.h>
#include <string>
#include <iostream>

/*
*
*
*/
class TrieTree
{
public:
	static const int MAX_BRANCH_SIZE = 26;

	// tree node
	typedef struct tagTireNode
	{
		tagTireNode* child[MAX_BRANCH_SIZE];
		int          leafFlag;

		tagTireNode():leafFlag(-1)
		{
			memset( child, 0x00, sizeof(child) );
		}

	}TrieNode, *pTireNode;

	TrieTree():m_root(new TrieNode), m_count(0)
	{

	}

	~TrieTree()
	{
		Clear();
	}

	/*
	* Clear all node
	*
	*/
	void Clear()
	{
		Clear( m_root );
	}

	/*
	* search string
	*
	*/
	bool Search( const char* word )
	{
		pTireNode cur = m_root;
		size_t depth = strlen( word );

		for( size_t i = 0; i < depth; i++ )
		{
			int idx = CharToIndex( word[i] );
			if( !cur->child[idx] )
			{
				return false;
			}

			cur = cur->child[idx];
		}

		return cur;
	}

	/*
	* Insert string to tree
	*
	*/
	void Insert( const char* word )
	{
		pTireNode cur = m_root;
		size_t depth = strlen( word );
		for( size_t i = 0; i < depth; i++ )
		{
			int idx = CharToIndex( word[i] );
			if( !cur->child[idx] )
			{
				if( 0 == i )
					m_count++;

				cur->child[idx] = new TrieNode;
			}

			cur = cur->child[idx];
		}

		cur->leafFlag = 0;
	}

	/*
	* Compress output tree
	*
	*/
	void OuputCompressTree( std::string& output )
	{
		OuputCompressTree( output, m_root );
	}

private:

	void OuputCompressTree( std::string& output, pTireNode root )
	{
		for( size_t i = 0; i < MAX_BRANCH_SIZE; i++ )
		{
			if( root->child[i] )
			{
				char c = IndexToChar( i );
				output += c;

				if( 0 == root->leafFlag )
				{
					return;
				}
				else
				{
					OuputCompressTree( output, root->child[i] );
				}

			}
		}

	}

	/*
	*
	*
	*/
	void Clear( pTireNode& node )
	{
		if( 0 == node )
			return;

		for( size_t i = 0; i < MAX_BRANCH_SIZE; i++ )
		{
			Clear( node->child[i] );
		}

		delete node;
		node = 0;
	}

	/*
	*
	*
	*/
	int CharToIndex( char input )
	{
		return (int)(input - ‘a‘);
	}

	/*
	*
	*
	*/
	char IndexToChar( int idx )
	{
		return (char)( idx + ‘a‘);
	}

private:

	pTireNode  m_root;
	size_t     m_count;

};

/*
* Test interface
*
*/
void TestTrieTree()
{
	char* words[] = {"the", "a", "there", "answer", "any", "by", "bye", "their", "ant", "these", "heap",
	                  "dynamic", "day", "micro", "meter", "mimic", "soul","such", "many", "metal" };
	size_t size = sizeof(words)/sizeof(words[0]);

	TrieTree tree;
	for( int i = 0; i < size; i++ )
	{
		tree.Insert( words[i] );
	}

	for( int i = 0; i < size; i++ )
	{
		assert( tree.Search( words[i] ) );
	}

	assert( tree.Search("man") );
	assert( tree.Search("met") );
	assert( tree.Search("so" ) );
	assert( !tree.Search("bee"));
	assert( !tree.Search("at") );

	std::string outputBuf;
	tree.OuputCompressTree( outputBuf );
	std::cout << outputBuf.c_str() << std::endl;

}

#endif 

compile and run in visual studio 2005

Trie Tree的c++实现,码迷,mamicode.com

时间: 2024-10-29 19:05:29

Trie Tree的c++实现的相关文章

笔试算法题(39):Trie树(Trie Tree or Prefix Tree)

出题:TRIE树 (Trie Tree or Prefix Tree): 分析: 又称字典树或者前缀树,一种用于快速检索的多叉树结构:英文字母的Trie树为26叉树,数字的Trie树为10叉树:All the descendants of a node have a common prefix of the sequence associated with that node, and the root is associated with the empty sequence. 由于不同的se

Trie tree 和 Ternary search 比较

Trie tree (字典树) 优点: 高效 缺点: 耗内存 Ternary search (结合Trie tree 和 二叉搜索树的各自优点,节省了内存,降低了效率) 简介: 三叉搜索树,左右两叉用于指引key大小的走向,中间叉表示与当前字符相等 优点: 节省内存 缺点: 没有Trie tree 高效,且插入顺序严重影响效率

Trie Tree简单实现

最近突然有兴致hiho一下了,实现了下trie tree,感觉而言,还是挺有意思的,个人觉得这货不光可以用来查单词吧,其实也可以用来替代Hash,反正查找,插入复杂度都挺低的,哈哈,啥都不懂,瞎扯....废话不多,正题开始! 题目截下: Trie Tree用来干啥呢,套用Hiho上的解释,比如存在一个字典,里面存在10000个单词,需要查找以xxx为前缀的单词个数,按照常规思维,10000 个单词,挨个比对,哇,复杂度爆炸!所以此时呀,将这些单词以树的形式存储,每个节点存放一个字符,这样一来,添

trie tree(字典树)

hihocoder题目(http://hihocoder.com/problemset):#1014 trie树 1 #include <iostream> 2 using namespace std; 3 class trieTree 4 { 5 public: 6 trieTree() 7 { 8 isword=false; 9 for (int i=0;i<26;i++) 10 { 11 next[i]=NULL; 12 } 13 } 14 ~trieTree() 15 { 16

字典树(Trie Tree)

在图示中,键标注在节点中,值标注在节点之下.每一个完整的英文单词对应一个特定的整数.Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的.键不需要被显式地保存在节点中.图示中标注出完整的单词,只是为了演示 trie 的原理. trie 中的键通常是字符串,但也可以是其它的结构.trie 的算法可以很容易地修改为处理其它结构的有序序列,比如一串数字或者形状的排列.比如,bitwise trie 中的键是一串位元,可以用于表示整数或者内存地址. Trie树是一种树形结

模板——字典树Trie Tree

/*字典序模板*/ #define MAX 26 //每层有多少种类 typedef struct trie { trie *next[MAX]; int v;//一个字典树到此有多少相同前缀的数目 }; trie *root; void creat_trie(char *str) { int len=strlen(str); trie *p=root,*q; for(int i=0;i<len;i++) { int id=str[i]-'a'; if(p->next[id]==NULL) {

树学习 ---------字典树(Trie Tree)

字典树,又称为字母数,前缀树等等,不仅可以存储字符,还可以存储数字等, 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节

Find the Clones Trie Tree

Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8306   Accepted: 3130 Description Doubleville, a small town in Texas, was attacked by the aliens. They have abducted some of the residents and taken them to the a spaceship orbiting around

trie tree

trie树也叫字典树,前缀树 字典树(Trie)有如下几条性质 结点不存值,依靠树枝(边)存值 从根节点到某一处标记点为一个单词 每个结点到其子节点的边上的值各不相同 插入和查询复杂度均为O(mn),m为字符串个数,n为字符串平均长度 树深度由最长字符串决定 依次便可做出trie树的结点结构 struct trie{ int cnt=0; bool word=0; trie * son[26]={0}; }; 让我们依次价绍这几个成员的含义 cnt 这条边上有几个单词经过,即有多少指定的前缀相同