【发布时间】:2016-07-15 21:54:30
【问题描述】:
我想知道我们如何使用二进制搜索来处理数组中的重复元素。例如,我有一个像 1 1 1 2 2 3 3 这样的数组。我有兴趣寻找最后一次出现的 2。
根据我之前看的一篇帖子,我们可以先用二分查找找到2,然后扫描相邻的元素。这大约需要 o(log(n)+k)。所以最坏的情况是当 k = n 时。然后它需要 O(n) 时间。有什么办法可以提高最差时候的表现。谢谢。
【问题讨论】:
我想知道我们如何使用二进制搜索来处理数组中的重复元素。例如,我有一个像 1 1 1 2 2 3 3 这样的数组。我有兴趣寻找最后一次出现的 2。
根据我之前看的一篇帖子,我们可以先用二分查找找到2,然后扫描相邻的元素。这大约需要 o(log(n)+k)。所以最坏的情况是当 k = n 时。然后它需要 O(n) 时间。有什么办法可以提高最差时候的表现。谢谢。
【问题讨论】:
对2.5 进行二分搜索。换句话说,如果您要搜索的值是N,那么您的代码应该将N 视为太小,而将N+1 视为太大。该算法的主要区别在于它不能幸运并提前终止(当它找到值时)。当high 和low 索引相等时,它必须一直运行到最后。此时,您所查找的索引与最终的high/low 索引之间的距离不应超过 1。
【讨论】:
最简单的方法是进行上限二进制搜索。这与您提到的二进制搜索完全相同,只是不是尝试查找数字的第一个实例,而是首先查找大于提供的数字的第一个实例。它们之间的区别只不过是将< 切换为<=。
一旦找到大于您的数字的第一个实例,后退一个索引,然后查看那里的值。如果是2,那么你找到了最后的 2。如果是其他,那么数组中没有 2。
【讨论】: