博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字典树在车站查询功能中的应用
阅读量:6325 次
发布时间:2019-06-22

本文共 2273 字,大约阅读时间需要 7 分钟。

1.在12306的火车票订票系统中,当我们在出发地或者目的地框中输入一个汉语拼音的简写时,就会出现相应的地名。如输入"wh"就会出现"武汉","威海","芜湖"等地名供选择。

2.用数据库实现上面的功能:建立一张表包括两个字段,一个字段用于存储汉字地名,另一个用于存储汉字拼音的简写。对于每次查询需要遍历整张表的记录数,筛选出满足条件的记录。假设每次查询字符串的长度为n,数据库的记录数为m。那么每次查询的时间复杂就是O(n*m)。另外数据库的信息一般都存放在磁盘中。

3.使用字典树的思想:在系统初始化的时候将拼音简写与汉字名称形成一棵字典树放入到内存中。每次查询只需要n次比较就可以找到结果。

4.数据的逻辑结构

 

struct TrieNode{	string name;//存储汉字地名信息	int flag;//标识是否是一个简写的结尾	TrieNode *next[26];};

5.字典树的初始化,假设已经有一个名为in.dat文件中写好了车站名与简拼之间的关系。从文件中读取数据,对于每一个<车站名,简拼>将简拼根据字典树的原理从根节点依次插入到字典树中。当处理到简拼的最后一个字符时,将车站名称存放到该节点中。代码实现如下:

 

#include
#include
#include
#include
using namespace std;struct TrieNode{ string name;//存储汉字地名信息 int flag;//标识是否是一个简写的结尾 TrieNode *next[26]; TrieNode() { flag=0; int i; for(i=0;i<26;i++) { next[i]=NULL; } }};TrieNode *root = new TrieNode();//定义一个根节点/*** str拼音简写,Cname车站名称*/void insert(char str[],string Cname){ TrieNode *p = root; int len=strlen(str),i,index; for(i=0;i
next[index]==NULL)p->next[index]=new TrieNode(); p=p->next[index]; } //最后一节点要有车站名和简写结束的标记 p->flag=1; p->name=Cname;}/*** str待查询的简写字符串如"nj"*/int query(char str[]){ TrieNode *p = root; int len=strlen(str),i,index; for(i=0;i
='z' || str[i]<='a')return -1; index = str[i]-'a'; p=p->next[index]; if(p==NULL)break; } if(p==NULL || p->flag==0)//待查询的字符串没有与其对应的结果 { cout<<"Not Found!"<
name<

in.data的数据如下:

 

nj  南京

njn  南京南

bj  北京

sh  上海

gz  广州

wh  武汉

6.从query函数中可以看出查找一个字符串的时间复杂度为O(n)。其效率比使用数据库存储要快很多。

7.在in.data中的最后一行加入"wh 芜湖",再执行query("wh");结果只显示"芜湖",也就是说对于相同的简写后面的数据会将前面的数据信息覆盖。解决办法:将TrieNode结构中的string name换成queue<string>队列行式,这样当有相同的简写时就将地名插入到队列中,查询时输出队列中的所有元素。当然也可以将name形成一个链表的形式,如使用链表形式,则数据结构可如下设计:

 

struct Node{	string name;	Node *child;};struct TrieNode{	struct Node place;	int flag;	int next[26];};

8. 在12306上当我们输入"w"时也给出地名供选择,而不是"wh"这样完整的情况下才能查询。要实现这种功能,只需要递归查询"w"所在节点的孩子节点,就可以查询出所有以"w"简写开头的地名。

 

实现代码如下:

 

void querySubNode(TrieNode *p){	int i;	TrieNode *temp = p;	if(p==NULL)return;	if(p->flag){		cout<
name<
next[i]!=NULL) { querySubNode(temp->next[i]); } }}

上面功能是基于第5步中的代码实现的。当再次执行query("n")时就会出现"南京","南京南"相应的信息。

 

9.用字典树和数据库实现车站查询功能的对比

(1).使用数据库实现时,信息存放在磁盘中,查询是对整个表进行比较。查询速度慢

(2).使用字典树在系统初始化时,即将信息以字典树的结构加入到内存。查询速度那是相当快。车站与简写对应信息变化时,只需要重新生成字典树就行。

转载地址:http://zkmaa.baihongyu.com/

你可能感兴趣的文章
puppet自动化管理工具学习之文件
查看>>
Ubuntu安装RPM格式软件包
查看>>
SQL Server中的临时表和表变量 Declare @Tablename Table【转】
查看>>
汇编语言指令英文全称
查看>>
pure-ftpd脚本安装
查看>>
Linux NC 命令
查看>>
ThinkingInJava_6
查看>>
抓取安居客二手房经纪人数据,python爬虫自动翻页
查看>>
Office 2013 正式版--英文版/简体中文版下载(正版验证)
查看>>
iOS程序框架设计之皮肤切换功能 (白天与夜间效果)
查看>>
iptables
查看>>
Project facet Java 6.0 is not supported by target runtime Apache Tomcat v5.5.
查看>>
一个全新的拖拽分页—艺术啊
查看>>
Linux学习之CentOS(三十)--SELinux安全系统基础
查看>>
LVS+keepalived高可用群集
查看>>
jQuery库简介
查看>>
win7系统设置电脑不待机状态的操作方法
查看>>
nginx+php安装配置
查看>>
LAMP+Centos6.5上安装zabbix
查看>>
android判断网络连接状态的三种方法
查看>>