gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:10:17 25 4
gpt4 key购买 nike

我读过:

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com