Trie implementation

  在学习 Aho - Corasick Automation Algorithm 之前,先学习一下,Trie 的实现过程:

  The name trie comes from its use for retrieval (检索) , 通常读“/ tri /" ;

  Trie is a special kind of tree ;

  What  is  trie  ?

  给你七八百个单词,然后随意给你一个单词,问一下这个单词是不是在这七八百个单词之中,if we stroe these words in liner array , it will be very unefficient (需要很大的内存,同时查找也需要很长时间). The model of trie more efficient ;

  reading more on Wikipedia page .

  通过下面的图,直观的介绍一下,数据在 Trie 中的存储方式:

  

A trie for key "A", "to", "tea", "ted", "ten", "i", "in", and "inn".

这样很 easy 避免了几个单词中具有重复部分占用内存空间的情况;

we store only the individual characters of the string key in the nodes

each node can have multiple children , 从 a 到 z (特殊考虑一下,全部为小写,不包含数字字符)同样造成了空间大量的浪费;不过没关系,我们可以找到某种方法,把那些不存在字符的结点给 detele 掉 即可 ;

在 Trie 中可以实现插入、删除、查找等功能,实现的功能不同,结点中的数据成员有所不同;

HDU中有一道题是关于 Trie 的运用 ,大致描述一下题意:

  输入N组电话号码,在输入的过程中,如果出现包含的情况,最后结果就输出NO,否则输出YES ;

  第一次用 Hash table 做的,果然不出所料,以超时而放弃,然后换为Trie来解答,结果没有delete掉不用的内存空间,结果内存超了,最后用了个递归,把不用的内存全部给delete掉,OK了!

下面给出这道题的代码,其中也有许多细节需要注意的地方:

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std ;

struct Node	{
	bool flag ;
	Node *next[11] ;
} ;

Node* new_Node()	{
	Node *root = new Node ;
	root->flag = false ;
	memset(root->next,NULL,sizeof(root->next));
	return root ;
} 
bool tag ;

void deletee( Node *r )	{
	for(int i = 0 ; i < 10 ; i++)	{
		if(r->next[i] != NULL)
			deletee(r->next[i]) ;
		delete(r->next[i]) ;
	}
}

void Construct_trie(Node *point , char *s)	{
	int len = strlen(s) ;
	for(int i = 0 ; i < len ; i++)	{
		if(point->flag || (point ->next[s[i]-'0'] != NULL && i == len - 1))
			tag = false ;
		if(point->next[s[i]-'0'] == NULL)
			point->next[s[i]-'0'] = new_Node() ;
		point = point->next[s[i]-'0'] ;
	}
	point->flag = true ;
}


int main()	{
	int m ; 
	scanf("%d", &m) ;
	while(m--)	{
	int n ; 
	scanf("%d",&n) ;
	Node *root = new_Node() ;
	tag = true ;
	while(n--)	{
		char s[10005] ;
		scanf("%s",&s) ;
		Construct_trie(root,s);
	}
	if(tag)
		printf("YES\n") ;
	else
		printf("NO\n") ;
	deletee(root) ;
	}
	return 0 ;
}

 

 

posted @ 2014-03-25 18:11  scott_ding  阅读(266)  评论(0编辑  收藏  举报