algorithm - 使用后缀树在字符串中搜索子字符串..?

标签 algorithm data-structures tree suffix-tree

我读过:

在 txt[1..n] 中搜索一个子字符串 pat[1..m],可以在 O(m) 时间内解决(在 txt 的后缀树已经在 O( n) 次).

但是在每个点,我们都必须选择要走的分支,所以就像在 n-ary 树中一样,在每个节点,我们必须与该节点中的所有 max n 指针进行比较,以决定走哪个分支。这不会给这个算法的复杂度带来 n 因素吗,在图片中不知何故

那上面怎么说可以在O(m)中找到子串呢?

我在这里错过了什么?

最佳答案

Then how above it says that substring can be found in O(m)?

遗漏。您是正确的,在后缀树中搜索的运行时间比单纯的 O(m) 更复杂。

但是,如果我们权衡空间需求,它确实可以加速到 O(m):我们需要将每个节点的搜索降低到 O(1),我们可以这样做通过使用适当的数据结构(例如数组),它可以在恒定时间内为每个字母提供适当的子树。

例如,假设您使用 C++ 来实现并且您的字符 (char) 可以包含 256 个不同的值。那么节点的实现可能如下所示:

struct node {
    char current_character;
    node* children[256];
};

现在,current_character 指的是通向当前节点的分支的字符,而children 是一个子节点数组。在搜索过程中,假设您当前位于节点 u,并且输入文本中的下一个字符是 c。然后你将选择下一个节点如下:

node* next = u->children[c];
if (next == 0) {
    // Child node does not exist => nothing found.
}
else {
    u = next;
    // Continue search with next …
}

当然,这仅适用于非常小的字母表(例如基因组序列的 DNA)。在大多数常见情况下,后缀树的最坏情况运行时间确实高于 O(m)。

关于algorithm - 使用后缀树在字符串中搜索子字符串..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276418/

相关文章:

php - 涵盖输入日期范围所有日期的日期范围组合

c++ - 如何选择合适的倍数?

python - __eq __()多次调用,而不是在嵌套数据结构中一次调用

Drupal 菜单系统 - 向下输出一棵树

c++ - 我如何递归搜索项目的列表列表,获得 "closest"匹配项

javascript - 将列表转换为嵌套对象树

将有序树转换为有向无环图的算法

algorithm - 堆栈遍历

c - 推送操作中对数组的堆栈操作错误

algorithm - OEIS如何进行后续检索?