Java 二进制搜索未排序数组

Java 二进制搜索未排序数组,java,arrays,binary-search,Java,Arrays,Binary Search,希望有人知道这个Java认证问题的答案: public static void main(String[] args) { String[] sa = {"d", "c", "a", "b" }; int x = Arrays.binarySearch(sa, "b"); Arrays.sort(sa); int y = Arrays.binarySearch(sa, "b"); System.out.println(x + " " + y); } 哪两种结果是可能的?(选择两个。)

希望有人知道这个Java认证问题的答案:

public static void main(String[] args) {
 String[] sa = {"d", "c", "a", "b" };
 int x = Arrays.binarySearch(sa, "b");
 Arrays.sort(sa);
 int y = Arrays.binarySearch(sa, "b");
 System.out.println(x + " " + y);
}
哪两种结果是可能的?(选择两个。)
A) 70
B) 7.1
C) 7.3
D) -10
E) -11
F) -13

唯一正确的答案是E)-1,因为如果你玩二进制搜索算法,这是唯一可能的输出。但是他们要我选择两个。。。 因此第二个必须是B)7 1,因为排序数组中的第二个二进制搜索将始终返回
1

所以我的问题是,为什么B)7 1是一个可能的结果? 更具体地说:未排序数组中的第一个binarySearch如何可能返回7


提前感谢

这是一个技巧性的问题。根据文档,未排序数组上的二进制搜索结果未定义:

在进行此调用之前,必须对数组进行排序(如上面的排序方法所示)。如果未排序,则结果未定义

这尤其意味着任何数字,包括7个,都是公平的游戏


排序后的结果定义良好:您将得到一个
1
。就像魔术一样,答案列表中只有两对以
1
结尾,因此
B
E
是考官希望你做出的选择。

这是一个技巧性问题。根据文档,未排序数组上的二进制搜索结果未定义:

在进行此调用之前,必须对数组进行排序(如上面的排序方法所示)。如果未排序,则结果未定义

这尤其意味着任何数字,包括7个,都是公平的游戏


排序后的结果定义良好:您将得到一个
1
。就像魔术一样,答案列表中只有两对答案以
1
结尾,因此
B
E
是考官希望你做出的选择。

你可能应该坚持文档,而不是你对二进制搜索的一般工作原理的了解。API文档非常清楚如何在未排序的数组上使用
Array.binarySearch
:“如果未排序,则结果未定义。”


换句话说,如果数组未排序,则结果不需要遵循任何规则。从二进制搜索的实现中,您可能知道结果不能超过数组长度。然而,这只是实现细节。你不能依赖它。

你可能应该坚持使用文档,而不是了解二进制搜索的一般工作原理。API文档非常清楚如何在未排序的数组上使用
Array.binarySearch
:“如果未排序,则结果未定义。”


换句话说,如果数组未排序,则结果不需要遵循任何规则。从二进制搜索的实现中,您可能知道结果不能超过数组长度。然而,这只是实现细节。你不能相信这一点。

看起来他们欺骗了你)看起来他们欺骗了你)因此,尽管事实如此,usorted BINARYSERCH的结果将始终是-1在这种情况下,他们希望我说7也是一个可能的结果,因为文档说结果是未定义的?好吧,所以那些混蛋真的想骗我。。。不过,谢谢你的回答!:)这正是重点。实现可以确保结果始终为-1或实际索引。文档不能保证未排序的数组可以这样做,因此您不能依赖它。OK,一个二进制搜索的实现几乎不会有很大的变化。考虑这个情况:列表的排序算法期望列表实现<代码>随机化访问<代码>稳定。根据文件规定,未实施该计划的清单不保证稳定性。起初,相同的算法可能会在内部用于此类列表,但代价是速度非常慢。稍后,为了加快速度,添加了一个fork,以便对未实现
随机访问的列表应用不同的算法。这种新的排序并不稳定,但如果您以前依赖它(即使文档从未给出过这种保证),您自己的代码将被破坏。“如果数组未排序,则结果不需要遵循任何规则”——这不太正确。文档还说数组是“使用二进制搜索算法”搜索的。二进制搜索算法定义得很好,虽然API调用的结果是“未定义的”(就像抽象的二进制搜索算法一样),但这与说结果是“随机和任意的”不同。@Ted:实现二进制搜索至少有两种方法。如果“意外”提前找到项目,则一个停止,另一个继续细分搜索空间,直到剩下一个元素。两者在未排序的数组中查找内容的机会都很小,但它们在不同的情况下都会成功。除了普通的二进制搜索,还可以使用不同于中间索引的索引来划分搜索空间。因此,尽管事实上,在这种情况下,usorted binarysearch的结果将始终是-1,但他们希望我说7也是一个可能的结果,因为文档说结果未定义?好吧,所以那些混蛋真的想骗我。。。不过,谢谢你的回答!:)这正是重点。实现可以确保结果始终为-1或实际索引。文档不能保证未排序的数组可以这样做,因此您不能依赖它。OK,一个二进制搜索的实现几乎不会有很大的变化。考虑这个情况:列表的排序算法期望列表实现<代码>随机化访问<代码>稳定。根据文件规定,未实施该计划的清单不保证稳定性。起初,相同的算法可能会在内部用于此类列表,但代价是速度非常慢。后来,为了加快速度,在appl中添加了一个fork