Python bisect: 值的搜索范围
Python bisect: search range of values
我正在探索 Python 中的 bisect
模块。该模块的全部用途对我来说很清楚,我现在知道如何使用它了。但是 Performance notes 在文档中说明了这一点:
Bisection is effective for searching ranges of values. For locating specific values, dictionaries are more performant.
“搜索值的范围”是什么意思? bisect
有 bisect_left()
和 bisect_right()
,它们都接受单个值来查找索引。对文档有任何解释吗?谢谢。
我认为这意味着在 [a, b]
范围内查找值效率更高。如果您需要找到等于 c
的值,则需要在列表内搜索。但是如果用字典的话,不用查找也可以在O(1)时间内找到。
Python 字典被散列,因此提供 O(1)
search/insert/delete 时间复杂度,而二进制搜索是对数的。
当您搜索特定值时,查找字典比二进制搜索更高效。如果您也在寻找特定值附近的范围,则二分搜索更有意义。例如,如果您想要最接近搜索词的值。或者,如果您想知道在您要查找的元素的位置之前已经有多少个元素。或者您正在查找的两个特定元素之间有多少元素。散列字典当然不能这样做。如您所见,在二进制搜索中,所有元素在总排序方面都是 相关的(但是它是为该特定类型定义的)。这个 属性 排序列表使二进制搜索能够对范围进行操作。在散列字典中,元素彼此无关,除非它们的散列值完全相同。
我正在探索 Python 中的 bisect
模块。该模块的全部用途对我来说很清楚,我现在知道如何使用它了。但是 Performance notes 在文档中说明了这一点:
Bisection is effective for searching ranges of values. For locating specific values, dictionaries are more performant.
“搜索值的范围”是什么意思? bisect
有 bisect_left()
和 bisect_right()
,它们都接受单个值来查找索引。对文档有任何解释吗?谢谢。
我认为这意味着在 [a, b]
范围内查找值效率更高。如果您需要找到等于 c
的值,则需要在列表内搜索。但是如果用字典的话,不用查找也可以在O(1)时间内找到。
Python 字典被散列,因此提供 O(1)
search/insert/delete 时间复杂度,而二进制搜索是对数的。
当您搜索特定值时,查找字典比二进制搜索更高效。如果您也在寻找特定值附近的范围,则二分搜索更有意义。例如,如果您想要最接近搜索词的值。或者,如果您想知道在您要查找的元素的位置之前已经有多少个元素。或者您正在查找的两个特定元素之间有多少元素。散列字典当然不能这样做。如您所见,在二进制搜索中,所有元素在总排序方面都是 相关的(但是它是为该特定类型定义的)。这个 属性 排序列表使二进制搜索能够对范围进行操作。在散列字典中,元素彼此无关,除非它们的散列值完全相同。