算法(五)字典树算法

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

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

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

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

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

在介绍字典树算法之前,我们先看看其他的解决办法:
假设单词表中10w个单词在一个10w.temp.txt文件中,每一行是一个单词;
要查询的2000个单词在另一个文件2k.word.txt文件中,每一行一个单词

两个文件长得差不多,大概是这个样子:
算法(五)字典树算法_第1张图片

grep版本
注意grep使用了“^”这个符号,表示从头匹配。这是一种正则表达式的用法。
算法(五)字典树算法_第2张图片

C语言版本(brute force)
将每一个要查询的单词与单词表中的单词进行比对,看是否是前缀。这段代码表现还不错,比grep快:
在这里插入图片描述
C(brute force)版本的结果与上面grep版本的结果是一致的:
在这里插入图片描述
具体代码如下:
算法(五)字典树算法_第3张图片
算法(五)字典树算法_第4张图片

算法(五)字典树算法_第5张图片
Python版本(brute force)
Python(brute force)还是很慢!
算法(五)字典树算法_第6张图片
具体代码如下:
算法(五)字典树算法_第7张图片

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

接下来我们就在字典树上一一实现这些操作:
声明部分:
算法(五)字典树算法_第8张图片
新建节点:
算法(五)字典树算法_第9张图片
插入单词到字典树中:
算法(五)字典树算法_第10张图片
遍历(打印单词):
算法(五)字典树算法_第11张图片
删除字典树:
算法(五)字典树算法_第12张图片
查找:在字典树中查找单词(查询的单词为前缀)
算法(五)字典树算法_第13张图片
完整的代码如下:
算法(五)字典树算法_第14张图片

算法(五)字典树算法_第15张图片

算法(五)字典树算法_第16张图片
算法(五)字典树算法_第17张图片

算法(五)字典树算法_第18张图片
其耗时:
在这里插入图片描述
由于字典树不是按照“查询单词”的顺序输出结果的,所以其原始输出结果与上面grep版本的结果不一致。但是,将两者的结果排序后再比较,结果就是完全一致的了。

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

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

(公众号:生信了)
算法(五)字典树算法_第19张图片

你可能感兴趣的:(#,序列算法)