通过给定列表进行二进制搜索

Binary Search Through Given Lists

。对于下面的每个列表,我必须说明在搜索 7..

期间它是否可以是一系列值

现在我通过一些研究了解到,二分查找通常适用于数字按升序或降序排列的情况,然后它会继续将列表分成两半,直到找到所需的数字。那么如果是这样的话,这些列表中的 none 是不是因为它们没有按顺序工作?

二分搜索可以应用于几种不同的情况,例如在树结构中总是有两个 children 而你需要选择一个,或者在数字数组排序的情况下你想在哪里快速找到号码等

在您介绍的情况下,您确实应该将该数字列表放入排序数组中,然后开始二分查找。二分搜索是一个递归函数,它从数组的中间索引开始。如果该索引处的数字高于您要查找的数字,则使用该索引的一半再次调用该函数,否则如果该索引处的数字较小,则递归使用上面的一半,否则它必须相等并且你找到了号码。

这允许数组之间有缺失的数字,并且您仍然可以相对快速地扫描数组以查找给定的数字。但是你必须先排序。

希望这有意义并有所帮助。

二分查找的工作方式是获取最左边的最小值和右边的最大值。然后你可以做一个简单的计算来得到中间点。获得中点后,将要搜索的内容与中点进行比较。如果它大于中点,则左侧移动到中点 + 1。如果它小于中点,则右侧变为中点 - 1。因此,您查看的范围会根据中点比较而变化。然后您重新计算以找到新的中点并从那里开始,直到找到或找不到您要搜索的内容。正因为如此,您会认为二分搜索在那些提供的列表上不起作用,除非已排序。但是……确实……

第一个列表的示例:

左边是索引 0 右边是索引 6 中点将是列表的大小...确实是 7/2..3.5 但事情通常会被截断...所以索引 3 是 24

如果你要比较你正在寻找的东西,36 和 24,它会大于。那么左边将成为中点 + 1,即索引 4,新的中点将成为索引 5。下一个比较类似,36 大于 25,因此左边将成为中点 + 1,即列表末尾,恰好是您要查找的号码。

所以...理论上二分搜索只适用于排序列表,但由于 3 个列表中的 2 个是如何放在一起的,它恰好可以工作。

For each list below I have to say whether or not it can be a sequence of values examined during the search for 36

这并不意味着您得到的列表是要执行 二进制搜索的列表。这意味着这些列表是值的序列 examined 来自某些原始(可能已排序)列表。


假设原始列表已正确排序,因此二进制搜索可行,只有第一个列表代表在执行搜索数字 36 时检查的有效值序列。

在二分查找中,被查找的数据必须是有顺序的,查找的每个新值都在小于查找值的前一个值和大于查找值的前一个值之间。

92, 22, 91, 24, 89, 25, 36

在第一个列表中,每个值都介于前面的 "lower than 36" 值和前面的 "higher than 36" 值之间。

93, 20, 91, 24, 92, 24, 36

第二个列表在 92 处失败,因为前一个小于 36 的数字是 24,而前一个大于 36 的数字是 91. 92 大于 91,因此不是可能的结果。

93, 27, 34, 62, 29, 39, 35, 36

第三个列表在 29 失败,因为它不在 3462 之间。 (我最初关于它在 62 失败的评论是错误的,因为 62 3493 之间。)