后缀树的实现形式

本文介绍了后缀树的概念,包括广义后缀树的构建方式,如通过添加独特结尾符或相同结尾符的方式。讨论了四种常见的后缀树存储方法:数组、链表、平衡树和哈希表,分析了各自的优缺点。最后,提供了采用链表存储结构构建广义后缀树的代码实现思路。
摘要由CSDN通过智能技术生成

————《高级数据结构》
上述后缀树T是根据字符串S的所有后缀构建的。有时候这个S可以是要给字符串集合,所以后缀树T是根据所欲字符串的后缀构建的。这种后缀树也叫做广义后缀树。
一种很自然的构建方式可以给每个字符串加两两不同的结尾符,这些结尾符没有在任何字符串中出现过。然后,我们将这些添加了结尾符的字符串首尾相接作为一个整体来构建其后缀树。由于任何一个后缀都不是其他后缀的前缀,并且任意连个字符串的结尾符不同,所以我们还是可以方便地找到所需要的后缀。不过,这种实现方式会多了许多没有意义的后缀,在空间和代码优美程度上都差强人意。
另外一种实现方式,是将每个字符串加相同的结尾符后依次添加进书中。在第i+1次添加字符串Si+1时,我们像在单独构建后缀树时一样,在原来树基础上逐步构建Si+1的隐式树。因为这种构建过程不会影响前i次的后缀,并且仍可以保证Si+1的所有后缀都被添加进来。这种方式会导致一个后缀属于多个字符串。所以在叶节点上,我们还需要开一个列表来终止于此的那些字符串编号。
6.代码实现
在实现代码之前,我们需要对后缀树的存储方式做一个讨论。主要原因是后缀树中涉及的字符种类范围不确定,可以是26个英文字母,可以是所有汉字,或者更糟糕。一下是常用的几种存储方式。
(1)数组。用数组存储孩子节点是最常用的方法之一。如果我们事先知道字符串中出现的字符集的大小,假设为C,那么后缀树中每个节点都需要维护一个包含C个元素的数组。这种方式可以在O(1)的时间内执行查找,插入操作,其主要缺点有空间浪费以及需要字符集固定。
(2)链表。用链表来维护孩子节点是,每个节点需要存储自己的第一个孩子节点,同时每个节点还要维护自己的相邻兄弟节点,这样就可以遍历一个节点的孩子了,不过这样查询和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值