algorithm - 存在大量重复项时二分查找算法的性能

标签 algorithm language-agnostic binary-search

http://katemats.com/interview-questions/说:

  • You are given a sorted array and you want to find the number N. How do you do the search as quickly as possible (not just traversing each element)?

    • How would the performance of your algorithm change if there were lots of duplicates in the array?

我对第一个问题的回答是二分查找,即 O(log(n)),其中 n 是数组中元素的数量。

根据this answer ,在最坏的情况下,当“元素 K 不存在于 A 中并且小于 A 中的所有元素”时,“我们最多有 log_2(n-1) 步”。

我认为第二个问题的答案是它不会影响性能。这是正确的吗?

最佳答案

如果你说的是最坏情况/大O,那么你是对的 - log(n) 是你的界限。但是,如果您的数据分布相当均匀(或者您可以映射到该分布),则在选择分区的位置进行插值可以获得 log(log(n)) 行为。当您也进行插值时,您还可以摆脱寻找最终元素之一的最坏情况(当然,也有新的病理情况)。

对于许多重复项,您可能愿意在下一个探针上进一步远离直接中心。重复次数越多,你就越有可能正确猜测。虽然总是选择中间点可以让你及时到达那里,但有根据的猜测可能会让你得到一些非常出色的平均行为。

当我面试时,我喜欢听到这些答案,包括书本知识和理论是什么,还有可以做哪些事情来专门针对特定情况。通常这些常数因素确实很有帮助(看看快速排序及其分区选择方案)。

关于algorithm - 存在大量重复项时二分查找算法的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27956982/

相关文章:

r - 后验概率的校准

javascript - 二分查找函数是正确的,但返回未定义

algorithm - 背包多重约束

language-agnostic - 选择哪种身份验证机制?

language-agnostic - 给定程序中的错误上限

algorithm - 将基于单元格的形状划分为最少量矩形的最佳方法

c# - 二进制搜索算法的扩展,用于查找要在数组中搜索的键值的第一个和最后一个索引

c++ - 二进制搜索是否具有 deque C++ 数据结构的对数性能?

algorithm - Prolog - 解决游戏,实现启发式

javascript - D3 强制布局 : How to maintain a given minimum distance between nodes?