【问题标题】:Python string 'in' operator implementation algorithm and time complexityPython字符串'in'运算符实现算法和时间复杂度
【发布时间】:2013-08-10 23:17:54
【问题描述】:

我在想in 运算符是如何实现的,例如

>>> s1 = 'abcdef'
>>> s2 = 'bcd'
>>> s2 in s1
True

在CPython中,用什么算法来实现字符串匹配,时间复杂度是多少?有没有关于这个的官方文档或维基?

【问题讨论】:

  • 谁能告诉我为什么 KMP 没有用于这个实现?

标签: python string algorithm cpython


【解决方案1】:

它是Boyer-MooreHorspool 的组合。

可以查看C代码here

快速搜索/计数实现,基于 Boyer-Moore 和 Horspool 之间的混合,顶部还有一些花里胡哨。有关更多背景信息,请参阅:https://web.archive.org/web/20201107074620/http://effbot.org/zone/stringlib.htm

从上面的链接:

在设计新算法时,我使用了以下约束:

  • 对于所有测试用例(基于真实代码),包括 Jim Hugunin 的最坏情况测试,都应该比当前的蛮力算法更快
  • 小设置开销;快速路径中没有动态分配(速度为 O(m),存储为 O(1))
  • 良好情况下的次线性搜索行为 (O(n/m))
  • 在最坏情况下不比当前算法差 (O(nm))
  • 应该适用于 8 位字符串和 16 位或 32 位 Unicode 字符串(无 O(σ) 依赖性)
  • 许多现实生活中的搜索应该是好的,极少数应该是最坏的情况
  • 相当简单的实现

【讨论】:

  • 感谢您的快速回复!根据effbot.org/zone/stringlib.htm这篇文章,时间复杂度是次线性的,优于KMP算法。
  • @mitchelllc 在最好的情况它可以是次线性的。
  • @arshajiii 是的,这就是我想要的。再次感谢!
  • @arshajiii 还有一个问题,你知道好案例什么时候发生吗?我想不通。谢谢
  • @mitchellc 可能在不经常出现“错误部分匹配”的情况下,例如'bcdefg' 并搜索 'fg' 而不是在 'aaaacaaab' 中寻找 'aab'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2017-04-28
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多