算法(五)字典树算法

关键词: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版本的结果不一致。但是,将两者的结果排序后再比较,结果就是完全一致的了。

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

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

(公众号:生信了)
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值