algorithm - 二分查找帮助

标签 algorithm binary-search

对于一个项目,我需要实现二分搜索。这种二分查找允许重复。我必须获得与我的目标匹配的所有索引值。如果发现中间有重复项,我考虑过这样做:

目标=G 假设有以下排序数组:

B、D、E、F、G、G、G、G、G、G、Q、RS、S、Z

我得到的 mid 是 7。由于双方都有目标匹配,并且我需要所有目标匹配,所以我认为获取所有目标的一个好方法是检查 mid + 1 是否具有相同的值。如果是,请继续向右中间移动,直到不是为止。所以,结果会是这样的:

B、D、E、F、G、G、G、G、G、G (MID)、Q、RS、S、Z

然后我会从 0 到 mid 来计算目标匹配项,并将它们的索引存储到数组中并返回它。

如果中间是一个匹配项,并且重复项恰好第一次出现在中间且位于数组的两侧,那么我就是这么想的。


现在,如果第一次不匹配怎么办?例如:

B、D、E、F、G、G、J、K、L、O、Q、R、S、S、Z

然后像平常一样,它会抓取 mid,然后从第一个到 mid-1 调用二分搜索。

B、D、E、F、G、G、J

由于 G 大于 F,因此从 mid+1 到最后调用二分查找。

G、G、J。

中期是一场比赛。既然是匹配,则通过for循环从mid+1到last查找,统计匹配的个数,并将匹配索引存入数组并返回。

这是二分搜索抓取所有重复项的好方法吗?如果您发现我的算法存在问题,请告诉我,并提供提示/建议(如果有)。我看到的唯一问题是,如果所有匹配项都是我的目标,我基本上会搜索整个数组,但话又说回来,如果是这种情况,我仍然需要获取所有重复项。

谢谢

顺便说一句,我的老师说我们不能使用向量、哈希或其他任何东西。他希望我们停留在数组级别并习惯使用它们和操作它们。

最佳答案

为什么您一找到匹配项就想放弃二分搜索的强大功能?为什么不在上半部分使用二分查找并缩小范围,直到找不到更多的 G,然后对下半部分执行相同的操作。这样在最坏的情况下你就不会搜索整个数组。您可以通过这种方式找到最小和最大索引,然后将它们以及所有中间索引存储在一个数组中。

关于algorithm - 二分查找帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2437353/

相关文章:

algorithm - 如何在一个谎言模型中进行二分查找?

java - 如何使用二进制搜索在排序数组中查找重复项?

c++ - 基于函数而不是集合的二进制搜索或迭代器?

java - 创建maxHeap,Collections.reverseOrder() 和((a, b) -> b - a) 的区别;

c++ - 查找最大容器大小 C++

algorithm - 设置优先队列值以优化找到 'gift' 的概率

确定表达式中哪些变量不需要确定答案的算法

算法设计: can you provide a solution to the knapsack problem where there is no maximum weight constraint?

java - 二分查找CompareTo Java

c++ - 搜索字符串数组