FSA/FSM/FST

摘要:
一个典型的应用是HashTable确定非循环有限状态接收器FSA(确定性循环起始接收器)。FSA需要满足以下条件:我们可以知道密钥是否在FSA中设置。此时,我们可以判断FSA是否处于最终状态(由图中的双循环表示),将u添加到密钥,将其移动到状态3,丢弃密钥中的u,然后返回状态0,丢弃密钥的j并将其移动至状态1。

有限状态机 Finite state machine 可以用来紧密的存储有序集合和有序键值对,并实现快速搜索
怎样用FSM来作为数据结构存储这样的数据?
什么是有序集合?
有序集合中的键按照字典顺序排序,典型的应用是BST/BTREE
什么是无序集合?
典型的应用是HashTable

确定无环有限状态接收器 FSA (deterministic acyclic finite state acceptor)
一个FSA需要满足以下条件:
• 确定性的。给定已给输入,最多只能转移到一个状态。
• 无环的。不能反序遍历。
• 接收器。FSA可以接收一系列特定的输入。

给定一个输入key,我们可以知道这个key这个key是否在FSA中
一个集合,只有一个key”jul”
FSA就像下面这样:
FSA/FSM/FST第1张

FSA是否包含”jul”
处理顺序如下:
• 给定j,FSA状态从0变为1.
• 给定u,FSA状态从1变为2.
• 给定l,FSA状态从2变为3.
输入结束,这时候判断一下FSA是否处在final状态(图中用双圈表示),表明jul确实在set中。

FSA是否包含”ju”
处理顺序如下:
• 给定j,FSA状态从0变为1.
• 给定u,FSA状态从1变为2.
输入结束,判断一下,此时是否处于final状态
判断一个key是否存在,受限于key的长度,而不是set的大小。

复杂的FSA,包含三个key,october,november,december
FSA/FSM/FST第2张

因为有相同的后缀ber,在FSA中只需要编码一次就行了。两个key有更大的相同的后缀,ember。

如何来遍历FSA中所有的key呢?

用一个简单的图,有三个key,jul,jun和mar。
FSA/FSM/FST第3张

遍历方式如下:
• 初始化状态0
• 移动到状态4,把j添加到key中
• 移动到状态5,把u添加到key中
• 移动到状态3,把l添加到key中,输出jul
• 返回状态5,把key中的l抛弃掉
• 移动到状态3,把n添加到key中,输出jun
• 返回状态5,把key中的n抛弃掉
• 返回状态4,把key中的u抛弃掉
• 返回状态0,把key中的j抛弃掉
• 移动到状态1,把m添加到key中
• 移动到状态2,把a添加到key中
• 移动到状态3,把r添加到key中,输出mar
这个算法直接应用一个栈存储访问过的状态,和一个栈存储相应的转移。时间复杂度为O(n),空间复杂度O(k),k是set中最长的键的大小。

什么是有序Map?
他和有序集合类似,只是多了一个输出
有序map常用在BST/BTREE
无序map常用在hashTable

FST (deterministic acyclic finite state transducer)确定无环有限状态转移器
FST满足以下特性:
• 确定性。
• 无环。
• 一个转移器。给定一系列输入,会输出一个值。当且仅当输入会达到FST的final状态。

FST和FSA什么区别?

给定一个key
FSA告诉你是否包含该值
FST不仅告诉你是否包含该值,还会返回和这个key相关的一个Value。

FST怎么实现返回值的?

一种方法是,在每次转移的时候添加一些值。当输入序列在状态之间转移的时候,输出序列也在慢慢增加。
Eg:map中只包含一个数据jul,对应的value为7:
FSA/FSM/FST第4张

如果要判断,FST中是否存在key”jul”,并且需要对应的返回值,处理过程如下:
• 初始化value为0
• 给定输入j,FST从状态0转移到1,value+7
• 给定输入u,FST从状态1转移到2,value+0
• 给定输入l,FST从状态2转移到3,value+0
输入结束,状态3为final状态,因此key存在,value为7

下面把k-v,”mar 3”添加到FST中
FSA/FSM/FST第5张

在起始节点,多了一个新的转移m,对应输出为3.如果我们查询jul,那么应该和上面是一样的处理过程。
继续,当添加一个有相同前缀的key,会发生什么呢?
添加key jun,value 6
FSA/FSM/FST第6张

在状态5和状态3之间添加了一个转移n。但是还有另外两个变化

  1. 0->4转移j输入对应输出从7变成了6.
  2. 5->3转移l输入对应输出从0变成了1.
    这个变化之后们可以正确查询jun和jul,并且返回正确的值。
    这种key的属性确保了,即使共享前缀,对于每一个key,然后只有一个唯一的路径可以贯穿整个machine。因此,每个key也有唯一的value。我们要做的就是怎么把这些输出放在转移中去。
    其实不仅可以共享前缀,还可以共享后缀。对于两个key tuesday和thursday,分别对于输出3和5.
    FSA/FSM/FST第7张

这两个key有相同的前缀t,相同的后缀sday,按照图里的方式可以保证输出的正确性。

Trie树构建
trie树,前缀树…..

免责声明:文章转载自《FSA/FSM/FST》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Cookie和SessionJava根据参数返回相应类下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

TCP连接与关闭

1、建立连接协议(三次握手) (1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。 (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。 (3) 客户必须再次回应服务段一个ACK报文,...

缓存三大问题的解决办法

1.缓存穿透  在大多数互联网应用中,缓存的使用方式如下图所示:       当业务系统发起某一个请求时:     首先判断缓存中是否有该数据。     如果缓存中存在,则直接返回数据。     如果缓存中不存在,则再查询数据库,然后返回数据。   了解了上述过程后,下面说说缓存穿透。   1.1 缓存穿透的危害   如果存在海量请求查询根本就不存在的数据...

ES入门 (3) 语法(1)DDL(1) 索引操作

1 RESTful   REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可...

centos下面配置key登录

centos下需要配置使用key登录,并且要禁止root登录 下面的操作都是用root来设置的 1.添加新用户 例如用户名leisiyuan useradd leisiyuan 2.设置密码 passwd leisyuan 3.给新用户添加到root权限组 运行visudo命令,找到root ALL=(ALL) ALL,在下面添加一行 ,然后保存即可 le...

redis 常用操作

/*1.Connection*/$redis = newRedis(); $redis->connect('127.0.0.1',6379,1);//短链接,本地host,端口为6379,超过1秒放弃链接 $redis->open('127.0.0.1',6379,1);//短链接(同上) $redis->pconnect('127.0....

3DESC加密算法

3DESC 请求参数和响应参数全采用3des加密规则,由于我是用.NET对接的,而第三方是Java开发的,所以两种程序之间采用的算法有一点差异,java的3des加密采用的是"DESede/CBC/PKCS5Padding"规则,所以对应的C#规则是"PaddingMode.PKCS7和CipherMode.CBC",使用CBC模式的话在C#下必须传入加密...