marisa-trie——一个基于高效Trie树实现的快速高效字符串压缩存储、查询匹配工具实践

news2024/12/26 10:55:30

在前文中,讲到了因为实际项目的需要,调研了一下当前比较好用字符串查询匹配算法,感兴趣的话可以直接看下:

《pyahocorasick——基于AC自动机的python高效字符串匹配实践》

本文的主要目的同前文相同,这里主要是介绍一下另一个好用的字符串查询匹配模块——marisa-trie,官方项目地址在这里,如下所示:

可以看到:目前也是将近1k的star量,略高于前文的AC自动机算法。

marisa-trie模块是一个Python库,提供了用于高效存储和检索字符串键的数据结构。它基于Trie(字典树)数据结构,并使用了高度压缩的表示形式,以提供快速的查找和低内存消耗。

marisa-trie模块的详细特性介绍如下所示:

  1. 高效的字符串检索:marisa-trie使用了Trie数据结构,可以有效地进行字符串的存储和检索。它支持高效的前缀搜索、模糊搜索和范围搜索等操作。

  2. 压缩存储:该模块使用了高度压缩的表示形式,可以大幅减小存储空间的需求。这在需要存储大量字符串键的场景下特别有用,可以节省内存和磁盘空间。

  3. 快速查找:由于采用了Trie数据结构,marisa-trie可以在接近常数时间复杂度下进行查找操作。这使得它非常适合需要高性能的字符串键查找任务。

  4. 支持可排序键:marisa-trie允许您存储和检索可排序的键。这使得它在需要对字符串键进行排序和范围查询的应用中非常有用。

  5. 简单易用:该模块提供了简单而直观的API,易于使用和集成到您的Python项目中。

marisa-trie算法是基于Trie(字典树)数据结构开发构建的,并使用了高度压缩的表示形式。下面是marisa-trie的算法构建原理的详细解释:

  1. Trie数据结构:Trie是一种树形数据结构,用于存储和检索字符串集合。它由根节点开始,每个节点代表一个字符,每条路径表示一个字符串。通过在树中的路径上移动,可以完成对字符串的查找操作。

  2. 构建Trie:为了构建marisa-trie,首先需要将字符串键插入Trie中。对于每个字符串键,从根节点开始,按照字符顺序依次向下遍历Trie,并在需要时创建新的节点。当遇到字符串的结束字符或无法继续匹配时,将该节点标记为终止节点。

  3. 排序节点:在构建完Trie后,需要对节点进行排序。排序的目的是为了后续的压缩步骤做准备。marisa-trie使用了特定的排序算法来保持Trie中字符串键的顺序。

  4. 压缩表示:一旦节点排序完成,marisa-trie使用了一种高度压缩的表示形式。它将具有相同前缀的节点合并为一个共享前缀节点。这样可以大大减小存储空间的需求,尤其是对于具有大量共享前缀的字符串键。

  5. 完成构建:一旦压缩表示完成,marisa-trie的构建就完成了。这样构建的marisa-trie数据结构可以在接近常数时间复杂度下进行高效的字符串键查找。

marisa-trie的算法构建原理使得它成为一种有效的数据结构,适用于需要高性能和低内存消耗的字符串键存储和检索任务。

简单的介绍就到这里,接下来我们来实地实践分析一下模块的应用性能。同上文使用相同的数据,核心代码实现如下所示:

patterns = ['an', 'un', 'is']
trie = marisa_trie.Trie(patterns)
text = 'In quiet solitude, peace is found,Where thoughts can wander, unbound.'
results = []
for i in range(len(text)):
    matches = trie.prefixes(text[i:])
    for matche in matches:
        results.append((matche,i,i+len(matche)))
print(results)

结果输出如下所示:

[('is', 25, 27), ('un', 30, 32), ('an', 50, 52), ('an', 54, 56), ('un', 61, 63), ('un', 65, 67)]

这里面每个子对象目标都是一个三元组数据,第一个元素就是查找出来的目标对象字符串,后面两个数字表示的就是当前匹配到的字符串在原始字符串文本中的开始索引和结束索引。

接下来我们想要实地测试一下该模块的查询匹配效率,编写测试代码生成随机字符串如下所示:

base_list=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 
        'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 
        'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
print(len(base_list))
all_list=[1,10,100,1000,10000,100000]
t_list=[]
for one_all in all_list:
    string=""
    for i in range(one_all):
        string+="".join(random.sample(base_list,10))
    print("string_length: ", len(string))

随机构建查询目标,查询1000次,如下所示:

for i in range(1000):
    one_str="".join(random.sample(base_list, one_num))
    one_patterns.append(one_str)

构建marisa_trie匹配查询,如下所示:

trie = marisa_trie.Trie(one_patterns)
results = []
for i in range(len(string)):
    matches = trie.prefixes(string[i:])
    for matche in matches:
        results.append((matche,i,i+len(matche)))

接下来我们进行实验,在实验中我们还想探索分析查询子串的长度和时间的关系,这里分别进行实验,如下所示:

【查询子串长度为1】

【查询子串长度为2】

【查询子串长度为3】

【查询子串长度为4】

【查询子串长度为5】

【查询子串长度为6】

【查询子串长度为7】

【查询子串长度为8】

【查询子串长度为9】

【查询子串长度为10】

从实验测试结果来看:marisa_trie的查询性能跟目标查询子串的长度之间没有明显的关系,我们测试了从1-10连续10组不同长度的子串在相同查询条件下的查询性能发现整体的走势是相同的。

为了直观对比分析,这里我将其绘制整体对比可视化曲线,如下所示:

感兴趣的话都可以试试看,相信会发现他的强大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1003284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 6.6 中的 SELinux 删除了 NSA 的引用

导读Security Enhanced Linux (SELinux) 二十年来一直是主线内核的一部分,它提供了一个实现访问控制安全策略的模块,现在广泛用于增强生产 Linux 服务器和其他系统的安全性。长期接触 Linux 的人可能不知道 SELinux 源自美国国家安全局 (NSA)。但是现在 …

centos 下 Makefile 独立模块编译ko

1、安装编译内核环境包 编译需要用到kernel 源码,centos 下需先安装 kernel-devel 包,要下与自己kernel 对应版本 yum install kernel-devel 2、首先从内核或自己写的模块,发到编译环境中 注:就像我自己拷贝一个 bcache 驱动的目…

pinduoduo(商品优惠券)API接口

为了进行电商平台 的API开发,首先我们需要做下面几件事情。 1)开发者注册一个账号 2)然后为每个pinduoduo应用注册一个应用程序键(App Key) 。 3)下载pinduoduo API的SDK并掌握基本的API基础知识和调用 4&#xff…

在Ubuntu系统中安装Docker

👨 作者简介:大家好,我是Taro,前端领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录 前言一、Ubuntu是什么?二、安装Docker1.…

2023-简单点-开启防火墙后,ping显示请求超时;windows共享盘挂在不上

情景描述 树莓派 挂载 windows共享盘 之前一直可以,突然有一天不行了 ping xxxx不通了 一查,或许是服务器被同事开了防火墙,默认关闭了ping的回显 操作: 开启ping回显cmd ping通了,但是挂载还是不行, 显示 dmesg命…

Mac电脑其他文件太占内存?如何进行删除

Mac老用户都知道在我们查看Mac内存时都会发现有一条“其他文件”占比非常高,它是Mac储存空间中的“其他”数据包含不可移除的移动资源,如,Siri 语音、字体、词典、钥匙串和 CloudKit 数据库、系统无法删除缓存的文件等。这些“其他文件”无用…

故障治理:如何进行故障复盘

故障复盘的重要性无需多说,每一次故障都是宝贵的学习机会,本人接手故障复盘工作已经半年有余,从一开始的手足无措,慢慢变得游刃有余。以下内容为本人从网上查阅学习多个专家经验,并结合工作经历总结而来,仅…

敏捷开发的几个要点

敏捷开发是一种以人为核心,迭代、增量式的软件开发方法。它强调团队成员的自我管理、面对变化时的快速适应能力,以及持续的沟通和协作。 以下是敏捷开发的几个要点: 敏捷宣言:敏捷开发遵循敏捷宣言,其中包括四个价值…

冠达管理:普通股是什么?

普通股是最常见的股票类型,由一家公司发行。买家以此实际上成为该公司的部分所有者,能够享有公司的股息和收益,一起还承当出资的危险。本文将从多个角度剖析普通股,其间包含普通股的定义、普通股的权益、普通股的优缺点、普通股的…

Python是否被高估了?

作为一门简洁易用、生态蓬勃且具有高泛用性的编程语言,Python一直以来都被不少人称作“编程语言中的瑞士军刀”。 尤其随着近来AI热潮席卷全球,Python在编程语言圈中的地位也随之水涨船高,甚至一度被视作AI专用语言或大数据专用语言。 然而…

华为交换机:MSTP的基础配置

现状分析 某公司的总部包含4个部门,为了增加网络的可靠性,需要所在的交换机上配置MSTP,确保网络不会出现环路问题,同时实现负载均衡。 网络设计 搭建网络拓扑,配置VLAN,Trunk,链路聚合。在4台…

腾讯云centos7.6安装部署备忘

1.Mysql 1.1 安装mysql wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum install mysql-community-server 1.1.1 安装后重启 service mysqld restart 1.1.2 初次安装mysql,root账…

谁懂啊!自制的科普安全手册居然火了

自制的科普安全手册居然火了 谁懂啊! 嗨嗨嗨!小仙女们,有没有见过这样的可以翻页的电子安全手册呢?自己随手就能轻松制作手册,结果一晚浏览量这么多!这可真是让人又惊又喜啊!快来分享一下我的喜…

vscode 左侧文件夹不见了

1.选择view 2.选择open view 3.找到folder 4.左侧出现folder

安达发|离散型制造业更适合APS智能排产软件

在当今全球制造业竞争激烈的环境下,企业如何提高生产效率、降低成本、提升产品质量和满足客户需求,成为了制造业发展的关键。其中,智能化生产管理技术的应用,尤其是APS(Advanced Planning and Scheduling,智能计划与排程)智能排产…

和鲸科技两项成果入选“智赋百业”2023年人工智能融合发展与安全应用典型案例

近日,2023 年中国国际服务贸易交易会人工智能融合发展与安全应用论坛在北京召开,大会同期举办了“智赋百业”人工智能融合发展与安全应用典型案例发布仪式,为由国家工业信息安全发展研究中心遴选出的 100 项优秀应用案例进行了授牌。上海和今…

【笔试强训选择题】Day40.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…

【笔试强训选择题】Day41.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&#xff…

ChatGPT写文书再次翻车,行文寡淡没有灵魂一眼假!

留学申请文书是每个渴望出国深造的学子都会面临的一道门槛。近年来,随着人工智能ChatGPT的迅猛发展,“文能写文章、武能改Bug”,AI代写留学文书逐渐成为一种趋势,不少人直呼申请文书有救了!然而,这种趋势是…

【启扬方案】基于启扬安卓屏一体机的医疗手推车解决方案

医疗手推车作为医院基础设施的一部分,被广泛应用于医院内部,包括急诊室、手术室、病房和其他临床部门。伴随着互联网技术的发展和行业的渗透,智慧医疗受到越来越多的青睐,这也使得很多医疗设施得到了改进,医疗手推车也…