二进制搜索,包含数组中的重复元素

时间:2016-07-15 21:54:31

标签: algorithm binary-search

我想知道如何使用二进制搜索处理数组中的重复元素。例如,我有一个像1 1 1 2 2 3 3的数组。我有兴趣寻找最后一次出现的2.

根据我之前读过的帖子,我们可以先用二进制搜索找到2,然后扫描相邻的元素。这需要大约o(log(n)+ k)。所以最坏的情况是k = n时。然后需要O(n)时间。有没有办法改善最差时间的表现。感谢。

2 个答案:

答案 0 :(得分:1)

最简单的方法是进行上限二进制搜索。这与你提到的二进制搜索完全一样,除了不是试图找到数字的第一个实例,它首先是一个大于提供的数字的第一个实例。它们之间的区别仅仅是将<切换为<=

一旦找到一个大于你的数字的第一个实例,退后一个索引,然后查看那里的值。如果它是2,那么你找到了最后的2.如果它是其他任何东西,那么阵列中没有2个。

答案 1 :(得分:1)

2.5进行二进制搜索。换句话说,如果您要搜索的值为N,那么您的代码应该将N视为太小,N+1就像它太大了。算法的主要区别在于它不能幸运并且提前终止(当它找到值时)。当highlow索引相等时,它必须一直运行到最后。此时,您寻找的索引距离最终high/low索引不应超过1。