对数组中的重复元素进行二分查找
binary search with duplicate elements in the array
我想知道我们如何使用二进制搜索处理数组中的重复元素。例如,我有一个像 1 1 1 2 2 3 3 这样的数组。我有兴趣寻找最后一次出现的 2。
根据我之前看过的一篇post,我们可以先用二分查找2,然后遍历相邻的元素。这大约需要 o(log(n)+k)。所以最坏的情况是当 k = n 时。然后它需要 O(n) 时间。有什么办法可以提高最坏时间的性能。谢谢。
最简单的方法是进行上限二分查找。这与您提到的二进制搜索完全一样,除了不是尝试查找数字的第一个实例,它首先是大于提供的数字的第一个实例。它们之间的区别只不过是将 <
切换为 <=
.
一旦找到大于您的数字的第一个实例,后退一个索引,并查看那里的值。如果是 2
,那么你找到了最后一个 2。如果是其他任何东西,那么数组中就没有 2。
对 2.5
进行二进制搜索。换句话说,如果您要搜索的值是 N
,那么您的代码应该将 N
视为太小,将 N+1
视为太大。该算法的主要区别在于它不能幸运地提前终止(当它找到值时)。当 high
和 low
索引相等时,它必须一直 运行 直到结束。届时,您查找的索引与最终 high/low
索引的距离不应超过 1。
我想知道我们如何使用二进制搜索处理数组中的重复元素。例如,我有一个像 1 1 1 2 2 3 3 这样的数组。我有兴趣寻找最后一次出现的 2。
根据我之前看过的一篇post,我们可以先用二分查找2,然后遍历相邻的元素。这大约需要 o(log(n)+k)。所以最坏的情况是当 k = n 时。然后它需要 O(n) 时间。有什么办法可以提高最坏时间的性能。谢谢。
最简单的方法是进行上限二分查找。这与您提到的二进制搜索完全一样,除了不是尝试查找数字的第一个实例,它首先是大于提供的数字的第一个实例。它们之间的区别只不过是将 <
切换为 <=
.
一旦找到大于您的数字的第一个实例,后退一个索引,并查看那里的值。如果是 2
,那么你找到了最后一个 2。如果是其他任何东西,那么数组中就没有 2。
对 2.5
进行二进制搜索。换句话说,如果您要搜索的值是 N
,那么您的代码应该将 N
视为太小,将 N+1
视为太大。该算法的主要区别在于它不能幸运地提前终止(当它找到值时)。当 high
和 low
索引相等时,它必须一直 运行 直到结束。届时,您查找的索引与最终 high/low
索引的距离不应超过 1。