Trie Tree简单实现

最近突然有兴致hiho一下了,实现了下trie tree,感觉而言,还是挺有意思的,个人觉得这货不光可以用来查单词吧,其实也可以用来替代Hash,反正查找,插入复杂度都挺低的,哈哈,啥都不懂,瞎扯....废话不多,正题开始!

题目截下:

Trie Tree用来干啥呢,套用Hiho上的解释,比如存在一个字典,里面存在10000个单词,需要查找以xxx为前缀的单词个数,按照常规思维,10000 个单词,挨个比对,哇,复杂度爆炸!所以此时呀,将这些单词以树的形式存储,每个节点存放一个字符,这样一来,添加一个词组,只需从根节点从上之下添加, 并将经过的节点计数加1,这样便可以统计拥有同一前缀的单词个数了,哎,不得不说,这种用树结构来存储词组的方法还真是方便,无论查找或者添加。说了这么 多,开始上代码,对了,写代码这次采用的从上之下的方式,不得不说,也是有种不同的感受.....

按照题目要求,可有以下代码:

int main()
{
	TrieTree tt;
	int a = 0;
	cin >> a;
	string s = "";
	char t[20];
	for (int i = 0; i < a; i++)
	{
		cin >> t;
		s = t;
		tt.add(t);
	}
	cin >> a;
	for (int i = 0; i < a; i++)
	{
		cin >> t;
		s = t;
		cout<<tt.search(t)<<endl;
	}
    return 0;
}

由题中要求,显然TrieTree需要实现add,search操作

class TrieTree
{
public:
	TrieTree();
	void add(string s);
	int  search(string s);
private:
	TrieNode root;
};

TrieTree::TrieTree():root(0)
{

}

void TrieTree::add(string s)
{
	TrieNode *t = &root;
	for (int i=0;i<s.length();i++)
	{
		t=t->add(s[i]);
	}
}

int TrieTree::search(string s)
{
	TrieNode *t = &root;
	int num = 0;
	for (int i = 0; i < s.length(); i++)
	{
		t=t->search(s[i]);
		if (t == NULL)
			return 0;
	}
	return t->num;
}

继续实现TrieNode:

class TrieNode
{
public:

	char c;
	int num;
	list<TrieNode*> tnv;
	TrieNode* add(char c);
	TrieNode* search(char c);
	TrieNode(char c);
};
TrieNode::TrieNode(char c)
{
	this->c = c;
	num = 0;
}
TrieNode *TrieNode::add(char c)
{
	auto t = tnv.begin();
	while (t!=tnv.end())
	{
		if ((*t)->c == c)
		{
			(*t)->num++;
			return *t;
		}
		t++;
	}
	TrieNode *m = new TrieNode(c);
	m->num++;
	tnv.push_back(m);
	return m;
}
TrieNode *TrieNode::search(char c)
{
	auto t = tnv.begin();
	while (t != tnv.end())
	{
		if ((*t)->c == c)
		{
			return *t;
		}
		t++;
	}
	return NULL;
}
时间: 2024-10-14 12:27:30

Trie Tree简单实现的相关文章

笔试算法题(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的c++实现

问题描述: 1.Tire tree 是一种用来存储字符串的高效的数据结构.它的插入和查询的时间复杂度为O(string length).用self balance tree 存储字符串的 时间复杂度为O(length(string)*lgN),N是树的节点树.Trie tree的查询和存储优势是很显然的: 2.它的缺点是树的存储空间变大,需要更多的内存: 3.它的每个节点会有多个孩子节点,同一节点下的孩子共享相同的前缀串(从根节点到父节点的字符串): 4.详细可见下图: 程序代码: #ifnde

Trie tree 和 Ternary search 比较

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

字典树(Trie Tree)

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

带CheckBox的dojo Tree简单实现,并实现级联选取

dojo自带的Tree不能实现CheckBox选取节点功能,第三方cbtree过于复杂,因此自己写了个简单的实现,能够实现子节点级联父节点直到根节点,父节点选取全选子节点的功能,但没有写父节点取消时的子节点取消,代码如下,大家可以自行拷贝修改 function createMenuTree() {            require(["dojo/request",               "dojo/store/Memory",              

可持久化 trie 的简单入门

可持久化 $trie$  ....又是一个表里不一的东西..... 可持久化 $trie$  的介绍: 和主席树类似的,其实可持久化就是体现在前缀信息的维护上(搞不懂这怎么就叫做可持久化了...) $trie$ (字典树)大家应该都知道,就是一棵用来做字符串匹配的树, 但是!在这里,可持久化 $trie$ 就是完全不一样的东西了... 基本上(我做过的题),可持久化都是用来维护  $XOR$   信息的... 比如说求某个范围内的最大区间异或和之类的,至于到了树上嘛,你懂的. 可持久化 $tri

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

/*字典序模板*/ #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) {

POJ 2367Genealogical tree 简单拓扑排序

Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3358   Accepted: 2255   Special Judge Description The system of Martians' blood relations is confusing enough. Actually, Martians bud when they want and where they want. T