【问题标题】:finite state or suffix tree有限状态或后缀树
【发布时间】:2014-05-24 12:15:41
【问题描述】:

我想创建一个算法来查找存在于字母表中的字符串中的子字符串。例如,在字符串“abcdefhhhasddasdabbba”中,我想查找由字母 {'a','b'}

生成的子字符串

所以我的输出将是:ab ,a ,abbba

如果我使用有限状态,我必须创建包含我的输出的精确有限状态,所以我必须在我的 sting 输入长度上采用所有可能的组合,我认为这根本不是有效的。

如果我使用后缀树,那么如何在树中找到可能不是前缀或后缀的子字符串?我是否应该为每个节点使用一个数组来保存子树的数据,然后检查该数组是否包含字母表中未包含的字符?

编辑:

复杂性至关重要。

【问题讨论】:

  • 这个问题的有限状态解决方案只需要两种状态:一种用于{a,b},另一种用于字母表的其余部分。
  • 我认为不是因为如果它只有 2 个状态,那么输出将得到 a ,b ,a ,b ...

标签: computer-science finite-automata suffix-tree


【解决方案1】:

这可以通过简单的循环来完成,不需要数据结构。

for each letter in word
  if letter in alphabet, then add it to a current "X"
  otherwise emit current "X" and set "X" to empty string

python 示例

word = 'aababadadadab'
alphabet = { 'a', 'b' }

X = ''
for letter in word + '$': 
  if letter in alphabet:
    X += letter
  else:
    print X
    X = ''

输出:

aababa
a
a
ab

为了简化代码,我使用“$”作为字母表之外的特殊字符

【讨论】:

  • 抱歉信息丢失,但我想以最低的复杂性做到这一点。如果我用字母表中的每个字符检查输入的每个字母,那么复杂度将类似于 O(n*m) , n:len(input), m:len(alphabet)
  • 你错了。 “检查一个字母”是 O(1) 使用哈希集,所以算法是 O(n),可能是最快的。
  • 有了固定的字母表,你也可以用位向量代替哈希表。
  • @larsmans 但您仍然需要从输入字符到位向量位置的映射,这需要散列(对于 O(1) 访问)。那么有什么区别呢?
  • 这与使用带有身份哈希和最大代码大小的哈希表完全相同:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2012-06-26
  • 2016-06-24
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多