【发布时间】:2012-09-07 13:20:56
【问题描述】:
假设我有文本“abcabx”。我想知道有一个重复的模式“ab”,它出现的所有位置,以及这些重复的上下文如何与它的其他出现相关。我还希望数据结构具有区分和隔离的独特模式“c”和“x”。我已经设置了一个后缀树来尝试这样做,它看起来像这样(from this SO answer):
这确实告诉我模式“ab”出现了两次,一次带有后缀“cabx”,另一次带有“x”。但是,根处的“ab”仅指向模式的第一次出现。它的叶子“cabx”中还嵌入了另一个“ab”,当我希望那个“ab”(在“cabx”中)以某种方式被确认为数据结构中的重复时。我知道根“ab”的“x”叶代表它,但我需要知道,在“ab”的“cabx”叶中,那里有一个“ab”。另外,两个独特的图案“c”和“x”是该边缘的一部分。加上它们在那个边缘的位置,以及它们的“主要定义”(根边缘?)之间的交叉引用。似乎可以通过遍历树并将其放在一起来解决这些问题,但我需要一个数据结构来完全存储这些信息。
也许更简单地说,数据结构需要清楚地说“这里是所有独特的模式”,“这里是所有重复的模式以及它们发生的每个地方”,以及“这里是关联所有这些东西”。
所以我想我正在为后缀树寻找一个类似图形的元素,它可以划分出已知的模式并明确地将它们关联起来。在此过程中,将注意到独特的模式。但是我还是想要后缀树的上下文特征,比如说“c”(不是“cabx”,而是“c”)和“x”都在“ab”之后,“abx”在“abc”之后,什么在他们之后(在更大的情况下)等等。是否有后缀树的适应可以做到这一点,或者可能是另一种算法?
【问题讨论】:
-
你看过增强后缀数组 (DOI 10.1016/S1570-8667(03)00065-0)吗?我不能 100% 确定它完全符合您的需求,但是:(a) 作为 suffix array,它可以很容易地访问子字符串的 all 上下文,(b)被增强,它包括模拟后缀树的数据结构,即您可以访问(模拟版本的)子节点等,(c)可以有效地搜索它,( d) 它可以以紧凑/简洁/压缩的形式存储,比树更有效。
标签: algorithm pattern-matching design-patterns suffix-tree