【问题标题】:Python bisect: search range of valuesPython bisect:搜索值的范围
【发布时间】:2022-01-09 08:39:59
【问题描述】:

我正在探索 Python 中的 bisect 模块。该模块的整个目的对我来说很清楚,我现在知道如何使用它。但是Performance notes 在文档中说明了这一点:

二分法对于搜索值范围很有效。对于定位特定值,字典的性能更高。

“搜索值范围”是什么意思? bisectbisect_left()bisect_right(),它们都接受单个值来查找索引。对文档有什么解释吗?谢谢。

【问题讨论】:

  • example in the docs 是说明性的,你想找到一个数字属于哪个bin,返回一个对应的字母等级。相反,如果您只想找到任何离散数量的项目之一,例如与学生 ID 对应的名称,字典会更高效(常数时间 vs log n)

标签: python algorithm sorting bisection


【解决方案1】:

Python 字典是散列的,因此提供 O(1) 搜索/插入/删除时间复杂度,而二进制搜索是对数的。

当您搜索特定值时,查找字典比二分查找更高效。如果您也在寻找围绕特定值的范围,则二进制搜索更有意义。例如,如果您想要最接近搜索词的值。或者,如果您想知道在您要查找的元素的位置之前已经有多少元素。或者您正在查找的 2 个特定元素之间有多少元素。散列字典当然不能这样做。如您所见,在二分搜索中,所有元素在总排序方面彼此相关(但它是为特定类型定义的)。排序列表的这一特性使二分搜索能够作用于范围。在哈希字典中,元素彼此无关,除非它们的哈希值完全相同。

【讨论】:

  • 好朋友!对字典和列表中的关系进行解释的编辑是我真正想知道的!会尽快接受
【解决方案2】:

我认为这意味着在[a, b] 范围内查找值更有效。如果您需要找到等于c 的值,则需要在列表中进行搜索。但是,如果您使用字典,则无需搜索即可在 O(1) 时间内找到它。

【讨论】:

  • 要清楚,找到等于c 的值不会搜索整个list。它仍然一分为二,所以成本是O(log n)。但是,如果您希望所有值都在一个范围内,则成本是 O(log n)(其中 n 是正在搜索的序列的大小)支付两次(以找到下限和上限),加上提取值的线性成本(无论范围如何)尺寸)。在dict 中查找范围内的所有值必须逐个查找,使其成为O(n)(其中n 是范围的大小;n 查找,每个都花费O(1))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多