当前位置: 首页 > news >正文

每日学习一个数据结构-FST数据结构与算法

文章目录

      • 一、FST数据结构概述
        • 1. 定义与特性
        • 2. 与其他数据结构的比较
      • 二、FST的构建过程
        • 1. 基本概念
        • 2. 插入过程
      • 三、FST的查询过程
        • 1. 基本步骤
        • 2. 优化技术
      • 四、FST在Elasticsearch和Lucene中的应用
        • 1. Elasticsearch
        • 2. Lucene
      • 五、总结

FST(Finite State Transducers,有限状态转换器)是一种高效的数据结构,它在计算机科学中特别是在文本处理、搜索引擎、自然语言处理等领域有着广泛的应用。以下是对FST数据结构与算法的详细解析:

一、FST数据结构概述

1. 定义与特性

定义:FST是一种有限状态机(FSM)的扩展,它不仅表示状态之间的转换,还能够在转换过程中携带额外的信息(即输出或值)。
特性:
确定性:在任何给定状态下,对于任何输入,最多只能遍历一个转换。
非循环:不可能重复遍历同一个状态。
转化器:具有相关的值(payload),final节点会输出一个值。

2. 与其他数据结构的比较

相对于Trie树,FST在存储大量字符串时能够显著减少空间占用,因为FST通过复用前缀和后缀来压缩数据。
相对于HashMap,FST的查询速度稍慢,但内存消耗要小得多。

二、FST的构建过程

1. 基本概念
  • 节点(Node):代表状态,可以存储额外的信息如是否已编译等。
  • 边(Arc):表示状态之间的转换,包含标签(label,即输入的字符)、目标节点(target,即转换后的状态)以及可能的输出值(output)和标志位(flags)。
2. 插入过程
  • 输入的字符串按字典序排序。
  • 对于每个字符串,从根节点开始,按照字符串中的字符逐个遍历或创建节点和边。
  • 如果遇到已存在的前缀,则在该前缀对应的节点上继续构建剩余部分。
  • 最终,每个字符串的最后一个字符对应的边指向一个final节点,该节点包含与字符串相关联的值(如果有的话)。

三、FST的查询过程

1. 基本步骤

从根节点开始,根据查询字符串中的字符逐个遍历节点和边。
如果在某个节点上找不到与当前字符匹配的边,则查询失败。
如果成功遍历完整个查询字符串并到达一个final节点,则查询成功,并可以获取与该节点相关联的值(如果有的话)。

2. 优化技术

二分查找:在Term Dictionary中使用二分查找技术来快速定位term。
前缀树(Trie)优化:通过构建前缀树来加速term的查找过程。然而,由于前缀树可能占用大量空间,因此通常使用FST来进一步压缩前缀树。

四、FST在Elasticsearch和Lucene中的应用

1. Elasticsearch

Elasticsearch是一个基于Lucene的分布式搜索和分析引擎。
Elasticsearch底层使用Lucene来构建倒排索引,而Lucene从4版本开始大量使用FST来优化倒排索引的存储和查询性能。

2. Lucene

Lucene是一个开源的全文搜索引擎工具包。
Lucene中的FST主要用于存储倒排索引中的term index,通过压缩term index来减少内存占用并提高查询速度。

五、总结

FST是一种高效的数据结构,它通过复用前缀和后缀来压缩存储空间,并通过确定性的状态转换来加速查询过程。在Elasticsearch和Lucene等搜索引擎中,FST被广泛应用于倒排索引的存储和查询优化中,以提高搜索性能并减少内存消耗。


http://www.mrgr.cn/news/29139.html

相关文章:

  • windows NGIMX配置WebSocket反向代理
  • 【CICD】CICD 持续集成与持续交付在测试中的应用
  • 炼码LintCode--数据库题库(级别:入门;数量:144道)--刷题笔记_01
  • 优惠券秒杀的背后原理
  • sql文件
  • Python学习从0到1 day26 第三阶段 Spark ④ 数据输出
  • rust快速创建Tauri App ——基于create-tauri-app
  • 变电站缺陷数据集8307张,带xml标注和txt标注,可以直接用于yolo训练
  • 《珠江水运》
  • C++ 类的默认成员函数-析构函数
  • C++使用Socket编程实现一个简单的HTTP服务器
  • NISP 一级 | 6.2 移动智能终端安全威胁
  • AG32 MCU与内置FPGA的FLASH空间如何划分
  • 一款免费开源且功能强大的思维导图软件-思绪思维导图
  • docker安装部署时的资源文件路径问题以及使用pecl工具简洁方便地安装php扩展
  • 如何在自动化测试中应用装饰器、多线程优化自动化架构?
  • Python | Leetcode Python题解之第414题第三大的数
  • 精选6大高效通信与链接API助力程式开发
  • C语言 | Leetcode C语言题解之第414题第三大的数
  • 【C++语言】C/C++内存管理
  • Java ETL - Apache Beam 简介
  • 绝缘子缺陷检测数据集
  • frp内网穿透功能使用教程
  • 【H2O2|全栈】关于CSS(5)如何制作一个搜索网页的首页?
  • 【RabbitMQ】可靠性传输
  • 部分动态铜皮的孤岛无法删除。报错