字典树(模版+源码)

字典树:

             又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

                                                               

           字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。

  Trie的查找(最主要的操作):
(1) 每次从根结点开始一次搜索;
(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;   (3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。   
(4) 迭代过程……   
(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

//字典树
#include<iostream>
#include<cstring>
using namespace std;
struct Trie{
	Trie *next[26];
	int v;
}; 
Trie root;
void Create(char *t)
{
	int len=strlen(t),i,id,j;
	Trie *p=&root,*q;
	for(i=0;i<len;i++)
	{
		id=t[i]-'a';
		q=new Trie;
		if(p->next[id]==NULL)
		{
			for(j=0;j<26;j++)
			q->next[j]=NULL;
			p->next[id]=q;
			p=p->next[id];
			p->v=1; 
		} 
		else
		{
			p->next[id]->v++;
			p=p->next[id];
		}
	}
}
int Find(char *str)
{
	Trie *p=&root;
	int len=strlen(str),i;
	for(i=0;i<len;i++)
	{
		p=p->next[str[i]-'a'];
		if(p==NULL)
		return 0;
	}
	return p->v;
}
int main()
{
	int i;
	char str[50];
	for(i=0;i<26;i++)
	{
		root.next[i]=NULL;
	}
	while(gets(str)&&str[0]!='\0')
	Create(str);
	cout<<"Input End"<<endl;
	memset(str,0,sizeof(str));
	while(gets(str)&&str[0]!='\0')
	cout<<Find(str)<<endl;
	return 0;
	/*
	input:
	sunshineissogood
     good
    sunshine
    sunshile
    issogood
    good
    goodmorning
    output:
    Input End
    sunshile
    1
    sunshine
    2
    sunshineissogood
    1
    gao
    0
   */   
}


对于创建树的过程中可以 不用动态申请节点q,直接 Trie a[40000],把q=a[i];i++这即可,,这样可以节省时间。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunshine_gao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值