Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 二进制搜索帮助_Algorithm_Binary Search - Fatal编程技术网

Algorithm 二进制搜索帮助

Algorithm 二进制搜索帮助,algorithm,binary-search,Algorithm,Binary Search,对于一个项目,我需要实现一个二进制搜索。这种二进制搜索允许重复。我必须得到与我的目标匹配的所有索引值。我曾考虑过,如果在中间发现一个复制品,我会这样做: 目标=G 假设存在以下已排序数组: B、 D,E,F,G,G,G,G,G,Q,rs,S,Z 我得到的中间值是7。因为两边都有目标匹配,我需要所有的目标匹配,所以我认为获得所有目标匹配的一个好方法是检查mid+1是否是相同的值。如果是的话,一直向右移动到中间,直到它不是。所以,结果是这样的: B、 D,E,F,G,G,G,G,G(中间),Q,rs

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

目标=G 假设存在以下已排序数组:

B、 D,E,F,G,G,G,G,G,Q,rs,S,Z

我得到的中间值是7。因为两边都有目标匹配,我需要所有的目标匹配,所以我认为获得所有目标匹配的一个好方法是检查mid+1是否是相同的值。如果是的话,一直向右移动到中间,直到它不是。所以,结果是这样的:

B、 D,E,F,G,G,G,G,G(中间),Q,rs,S,Z

然后,我将从0到mid进行计数,对目标匹配项进行计数,并将它们的索引存储到一个数组中并返回它

这就是我当时的想法,如果mid是匹配的,而复制品第一次恰好在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,所以从中间+1到最后调用二进制搜索

G、 G,J

中场是一场比赛。因为它是一个匹配项,所以通过for循环从mid+1到last进行搜索,计算匹配项的数量,并将匹配索引存储到数组中并返回

这是二进制搜索获取所有重复项的好方法吗?请让我知道,如果你看到我的算法和提示/建议,如果有的问题。我看到的唯一问题是,如果所有匹配项都是我的目标,我基本上会搜索整个数组,但如果是这样,我仍然需要获取所有重复项

多谢各位


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

为什么您希望在找到匹配项后立即摆脱让二进制搜索如此强大的因素?为什么不在上半部分使用二进制搜索,并缩小搜索范围,直到没有更多的G,然后对下半部分也这样做呢。这样,在最坏的情况下,您不会搜索整个阵列。用这种方法找到最小和最大索引,然后将它们加上所有中间索引存储在一个数组中。

参考stl中函数的源代码


如果你手头或学校图书馆里有一本编程珍珠,请参阅本书末尾的第4章及其解决方案

请注意,您不是在搜索元素X,而是在搜索边界Y,X,其中Y我回答了一个使用改进的二进制搜索算法的解决方案。由于这是家庭作业,除非您希望链接被破坏,否则不要单击该链接,但要点是,通过修改二进制搜索循环中的条件,您可以让它执行以下3种行为之一:

  • 在找到匹配项时返回匹配项(正常行为,匹配项可以在相同值的运行中的任何位置)
  • 返回最左边的匹配项
  • 返回最右边的匹配项

  • 然后,通过运行此二进制搜索两次来回答您的问题,一次查找最左侧的匹配项,然后再次查找最右侧的匹配项(仅当第一次运行成功时)。两个结果(即匹配索引)之间的差异比找到的总匹配数少1。

    让我们看看您尝试了什么。然后我们知道如何帮助您解决您的具体问题。可能的重复由于这是家庭作业,他的导师希望他们能够熟练地操作数组,我认为STL已经过时了。我认为回答者的意思是“看看函数是如何实现的”。如果我理解您的意思,在这样的情况下,您的答案会起作用:bdg G G S Z下半部分:bdg G->bdg,其中mid+1是最小索引。上半部分:gsz->gsz,其中mid-1是最大索引。是这样吗?如果是的话,我不确定它在这种情况下是否有效:bdefgfgghqrsz下半部分:bdefgfgg->ggg,其中Mid-1必须是最小索引。上半部分:ghqrsz->ghq,其中mid-2必须是上半部分的索引。我理解你说的话了吗?没有。用你的例子来说明:bd G G G G S Z mid=G(索引7),现在检查上半部分G G S Z.mid=G(索引11),现在检查上半部分G S Z.mid=S,而不是G,所以检查下半部分G mid=G(索引12),因为没有更多要检查的内容,指数12给出了我们的最大指数。现在我们在下半部分重复这个过程,得到最小索引是2。然后我们知道2到12之间的指数都是G。谢谢。我现在理解了你所用的例子。但是,第二个例子呢?B D E F G G G H Q R S Z.上半部分:G H Q R S Z mid=R,->检查G H Q mid=H,->G以便最大索引为8。但是,对于下半部分:bde F G mid=F,->检查G mid=G。在这种情况下,mid是匹配的,但不是最小索引。或者,也许我做错了什么…:(您的想法是正确的,但您会不断迭代该过程(或使用递归,如果您愿意),直到得到最终索引。这就是为什么在示例中会多次检查上半部分。例如,您刚才给出的下半部分的过程如下:bde F G G,mid=F(索引3),检查G,mid=G。现在mid是一个匹配项,但我们不只是想要一个匹配项,我们想要第一个G。所以我们检查下半部分,然后再次得到G(索引4),因为我们没有要检查的上半部分或下半部分,我们得到的最小索引是4.B