- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试评估不同的子字符串搜索 (ala strstr) 算法和实现,并寻找一些精心设计的 needle and haystack 字符串,它们将捕获最坏情况下的性能和可能的极端情况错误。我想我可以自己解决它们,但我认为有人必须在某个地方收集大量测试用例......
最佳答案
一些想法和对自己的部分回答:
暴力算法的最坏情况:
a^(n+1) b
在 (a^n b)^m
例如aaab
在 aabaabaabaabaabaab
SMOA 的最坏情况:
类似于 (yxyxyxxyxyxyxy)^n
中的 yxyxyxxyxyxyxx
。需要进一步细化。我试图确保每个进步只是部分匹配长度的一半,并且最大后缀计算需要最大量的回溯。我很确定我在正确的轨道上,因为这种情况是迄今为止我发现的唯一使我的 SMOA 实现(渐近 6n+5
)运行速度变慢的方法比 glibc 的 Two-Way(渐近 2n-m
但具有适度痛苦的预处理开销)。
任何基于滚动哈希的最坏情况:
无论字节序列是什么,都会导致哈希值与针的哈希值发生冲突。对于任何相当快的散列和给定的针,应该很容易构造一个大海捞针,其散列在每个点都与针的散列发生冲突。然而,似乎很难同时创建长部分匹配,这是获得最坏情况行为的唯一方法。自然地,对于最坏情况下的行为,指针必须具有一定的周期性,以及一种通过仅调整最终字符来模拟散列的方法。
双向的最坏情况:
似乎是具有非平凡 MS 分解的非常短的针 - 类似于 bac
- 干草堆在针的右半部分包含重复的误报 - 类似于 dacdacdacdacdacdacdac
。该算法可能变慢的唯一方法(除了 glibc 作者实现不佳......)是使外部循环迭代多次并反复产生该开销(并使设置开销显着)。
其他算法:
我真的只对空间O(1)
且预处理开销低的算法感兴趣,所以我没有过多研究它们的最坏情况。至少 Boyer-Moore(没有修改使其 O(n)
)有一个不平凡的最坏情况,它变为 O(nm)
。
关于c - 什么是基准测试和压力测试子字符串搜索算法的好测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3134602/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!