【发布时间】:2015-06-26 01:29:10
【问题描述】:
问题已经在标题中了,如果n是string和m的长度,Python中str.find(string, substring)的C实现的最坏情况时间复杂度是多少 是substring 的长度吗?源代码 (https://hg.python.org/cpython/file/99f5a0475ead/Objects/stringlib/fastsearch.h) 似乎在谈论 boyer-moore-horspool 算法,根据维基百科,该算法的最坏情况复杂度为 O(m*n )。
编辑: O(m*n) 指的是boyer-moore-的运行时间horspool 算法,查找所有字符串中子字符串的出现。 Python 的str.find 方法只找到一个 出现的子字符串,所以它的(str.find) 将取决于substring 第一次出现的位置。所以不,我还没有发布答案。
【问题讨论】:
-
他们还提供了一个链接了解更多背景 effbot.org/zone/stringlib.htm
-
您的实际问题是什么,您已经在链接到的文档中找到了答案?
-
如果你有很多重复的子串,那么寻找单个子串仍然是 O(mn)。约束条件下的链接状态*在最坏情况下不比当前算法差 (O(nm)) 并且 许多现实生活中的搜索应该是好的,很少应该是最坏的情况 这使得很明显,在某些情况下它可能是 O(nm)。它总是线性或次线性的情况涉及构建表,除非字符串很长,否则构建成本将超过复杂性。
-
同样受到限制的是小的设置开销;快速路径中没有动态分配(速度为 O(m),存储为 O(1)),因此显然没有存储很多。 Python 可以根据字符串的条件使用更好的算法,但对于幼稚的方法,最坏的情况是 O(m*n) - 你可能会发现这是一篇有趣的文章old.blog.phusion.nl/2010/12/06/efficient-substring-searching
标签: python c string algorithm time-complexity