前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法(五)字典树算法快速查找单词前缀

算法(五)字典树算法快速查找单词前缀

作者头像
一只羊
发布2019-07-27 18:58:40
2.2K0
发布2019-07-27 18:58:40
举报
文章被收录于专栏:生信了生信了

关键词:trie; prefix; search; match;

字典树,又称单词查找树,是一个典型的一对多的字符串匹配算法。“一”指的是一个模式串,“多”指的是多个模板串。字典树经常被用来统计、排序和保存大量的字符串。它利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较。

那它一般应用在什么地方呢?我们举一个例子说明:

假设有一个单词表,里面有10w个单词。如果别人给你2000个单词,看这2000个单词是否在单词表中。该如何呢?当然可以用hash来实现啦!

但是,如果要看这2000个单词是否是单词表中单词的前缀(比如,”ab”是”abcd”的前缀)该怎么办呢?这个时候用hash就不适合了!而这种情况下用字典树算法就非常适合!

在介绍字典树算法之前,我们先看看其他的解决办法:

(假设单词表中10w个单词在一个10w.temp.txt文件中,每一行是一个单词;

要查询的2000个单词在另一个文件2k.word.txt文件中,每一行一个单词。

两个文件长得差不多,大概是这个样子:

grep版本

注意grep使用了“^”这个符号,表示从头匹配。这是一种正则表达式的用法。

C语言版本(brute force

将每一个要查询的单词与单词表中的单词进行比对,看是否是前缀。这段代码表现还不错,比grep快:

C(brute force)版本的结果与上面grep版本的结果是一致的:

具体代码如下:

Python版本(brute force)

Python(brute force)还是很慢!

具体代码如下:

C(字典树)

一般来说,树这种数据结构会包含以下操作:创建/初始化/新建(create/init/new)、插入(insert)、删除(delete)以及遍历(traversal)等。用于查询的树还会包含查询(find)操作。

接下来我们就在字典树上一一实现这些操作:

声明部分:

新建节点:

插入单词到字典树中:

遍历(打印单词):

删除字典树:

查找:在字典树中查找单词(查询的单词为前缀)

完整的代码如下:

其耗时:

由于字典树不是按照“查询单词”的顺序输出结果的,所以其原始输出结果与上面grep版本的结果不一致。但是,将两者的结果排序后再比较,结果就是完全一致的了。

至此,我们可以看出,字典树还是加快了查询单词(作为前缀)的效率,其耗时最短!

如果有任何问题,欢迎交流!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信了 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档