对于我需要实现二进制搜索的项目。这种二进制搜索允许重复。我必须获得与我的目标匹配的所有索引值。如果发现副本在中间,我已经考虑过这样做了:
目标= G. 假设有以下排序数组:
B,D,E,F,G,G,G,G,G,G,Q,R S,S,Z
我得到中间值为7.由于双方都有目标匹配,并且我需要所有目标匹配,我认为如果它是相同的值,那么获得所有匹配的好方法是检查mid + 1。如果是的话,继续向右移动,直到不是。所以,它会像这样:
B,D,E,F,G,G,G,G,G,G(MID),Q,R S,S,Z
然后我会计算从0到mid来计算目标匹配并将它们的索引存储到数组中并返回它。
如果中间是一场比赛并且副本恰好位于阵列的第一次中间和阵列的两侧,那就是我想要这样做的。
现在,如果第一次不匹配怎么办?例如:
B,D,E,F,G,G,J,K,L,O,Q,R,S,S,Z
然后正常情况下,它会抓住mid,然后从第一个到第一个中间调用二进制搜索。
B,D,E,F,G,G,J
由于G大于F,因此从mid + 1到last持续调用二进制搜索。
G,G,J。
中期是一场比赛。由于它是匹配项,因此通过for循环从mid + 1到last进行搜索并计算匹配数并将匹配索引存储到数组中并返回。
这是二进制搜索抓住所有重复项的好方法吗?如果您发现我的算法存在问题,请通知我。如果有的话,请提示/建议。我看到的唯一问题是,如果所有匹配都是我的目标,我基本上会搜索整个数组,但是如果是这样的话,我仍然需要获得所有重复项。
谢谢
顺便说一句,我的导师说我们不能使用Vectors,Hash或其他任何东西。他希望我们留在阵列级别并习惯使用它们并操纵它们。答案 0 :(得分:2)
为什么你想在找到匹配后立刻摆脱使Binary搜索变得如此之好的原因?为什么不在上半部分使用二进制搜索并缩小它直到你没有得到更多的G,然后对下面做同样的事情。在最糟糕的情况下,你不会搜索整个阵列。您可以通过这种方式找到最小和最大索引,然后将这些以及所有中间索引存储在数组中。
答案 1 :(得分:2)
参考stl中lower_bound函数的源代码。
如果您手头或学校图书馆有编程珍珠的副本,请参阅本书末尾的第4章及其解决方案。
答案 2 :(得分:2)
我回答了this question一个使用修改后的二进制搜索算法的解决方案。由于这是家庭作业,除非你想要它被破坏,否则不要点击链接,但要点是通过修改二进制搜索循环中的条件,你可以让它做以下3种行为中的任何一种:
然后通过运行此二进制搜索两次来回答您的问题,一次找到最左边的匹配,然后再次找到最右边的匹配(仅当第一次运行成功时)。两个结果之间的差异,即匹配指数,比找到的总匹配数少1。
答案 3 :(得分:0)
结帐this past question。接受的答案使用STL,但其他一些答案有一些可能对您有帮助的信息。
答案 4 :(得分:0)
请注意,您没有搜索元素X,但是您正在搜索边界Y,X,其中Y&lt; X和X对称,X,Z,其中X < Z.这些边界也可以在由元素间边界组成的虚数阵列中通过二分搜索找到。