algorithm - 使用随机元素进行二分查找

标签 algorithm big-o time-complexity binary-search

我知道二分搜索的时间复杂度为 O(logn) 来搜索排序数组中的元素。但是假设如果我们不选择中间元素,而是选择一个随机元素,它将如何影响时间复杂度。它仍然是 O(logn) 还是其他什么?

例如: 在大小为 18 的数组中进行传统的二进制搜索,将像 18 -> 9 -> 4 ...

我修改后的二分查找ping一个随机元素,并根据值决定删除右边的部分或左边的部分。

最佳答案

我的尝试:

C(N) 为在 N 元素中搜索所需的平均比较次数。为简单起见,我们假设算法仅在只剩下一个元素时终止(与 key 严格相等时不会提前终止)。

由于枢轴值是随机选择的,剩余大小的概率是统一的,我们可以写出递归

C(N) = 1 + 1/N.Sum(1<=i<=N:C(i))

然后

N.C(N) - (N-1).C(N-1) = 1 + C(N)

C(N) - C(N-1) = 1 / (N-1)

这个递归的解是调和级数,因此行为确实是对数的。

C(N) ~ Ln(N-1) + Gamma

请注意,这是自然对数,比以 2 为底的对数好 1.44 倍!

我敢打赌,添加提前终止测试会进一步改善对数基础(并保持对数行为),但同时会增加一倍的比较次数,因此在全局范围内,它在比较方面会更糟。

关于algorithm - 使用随机元素进行二分查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28537052/

相关文章:

algorithm - 嵌套循环的时间复杂度,是Big O还是Big Theta?

sql - 从 SQL 表中按 O(1) 选择

javascript - 链接多个 Array.prototype.*function* 的性能问题是什么?

java - 如何使用 chartAt() 和数组技术将两个字符串合并为一个

c - KnapSack Branch and Bound 奇怪的编译错误

检查数组 S 和 T 是否为整数 s 和 t 所以 s+t=k 如果 k 是给定数字的算法

algorithm - 对 "two-sum"有 O(n^2) 算法,转换为 O(n) 线性解

algorithm - 为什么用 Big O 表示法而不是 Theta 给出算法复杂度?

python - NetworkX:如何从一组预定位置构建 Erdos-Renyi 图?

javascript - 递归检查字符串是否为回文的算法的时间复杂度是多少?