Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Java 如果需要对数组进行排序,它会算作二进制搜索算法的一部分吗_Java_Arrays_Algorithm_Binary Search - Fatal编程技术网

Java 如果需要对数组进行排序,它会算作二进制搜索算法的一部分吗

Java 如果需要对数组进行排序,它会算作二进制搜索算法的一部分吗,java,arrays,algorithm,binary-search,Java,Arrays,Algorithm,Binary Search,我试图了解二进制搜索算法的速度。 我知道它需要对排序数组进行操作。 但是,如果数组未排序而进入并执行排序。排序不是二进制搜索的一部分吗,因此它的性能会更慢 我感到困惑,因为我认为如果数据没有分类,那么使用这种算法的机会很小。 如果我的代码需要对它进行排序,那么为什么它不计入搜索算法呢 对不起,如果我弄糊涂了, 谢谢你的帮助。是的如果 数据未分类 您只需要搜索一个元素 …然后您必须首先对数据进行排序以使用二进制搜索,这将花费总时间O(n logn+logn)=O(n logn) 但一旦对数据进

我试图了解二进制搜索算法的速度。 我知道它需要对排序数组进行操作。 但是,如果数组未排序而进入并执行排序。排序不是二进制搜索的一部分吗,因此它的性能会更慢

我感到困惑,因为我认为如果数据没有分类,那么使用这种算法的机会很小。 如果我的代码需要对它进行排序,那么为什么它不计入搜索算法呢

对不起,如果我弄糊涂了,
谢谢你的帮助。

是的如果

  • 数据未分类
  • 您只需要搜索一个元素
…然后您必须首先对数据进行排序以使用二进制搜索,这将花费总时间O(n logn+logn)=O(n logn)


但一旦对数据进行了排序,您就可以对该数据进行任意次数的二进制搜索。你不必每次都对它重新排序。

你不能只指着一个算法说:它有
O(n^2)
复杂性

这是人们通常说的,当然。但这是速记。他们忽略了一些事情;假设听众/读者会做出假设

您需要全面描述精确算法、应用该算法的条件以及
n
和任何其他变量的精确定义

然后,你可以回答这个问题。这里的问题是“什么是二进制搜索的性能”的定义不清楚。如果你假设它的意思是X,而你的朋友假设它的意思是Y,然后你就答案进行争论,那么你实际上根本没有进行建设性的辩论。你只是在向风车倾斜;真正的问题是,你们两人都没有意识到问题在于沟通基础知识

考虑到这里有一些混乱,我将给你3个不同的或多或少同样合理的更充实的定义,以及每个定义的实际答案。提示,对其中一个来说,“二进制搜索”不是最快的算法

给定[1]一个已排序的列表和[2]一个值,请编写一个算法,确定该值是否在列表中

最好的答案是:一个二进制排序算法,它的复杂性是
O(logn)

给定[1]一个未排序的列表和[2]一个值,请编写一个算法,确定该值是否在列表中

最好的答案是:只需遍历列表。它的复杂性将是O(n),二进制排序根本不是这个答案的一部分

给定[1]一个未排序的列表,[2]一个测试列表,其中每个单独的测试由一个值定义,但它们都使用相同的输入未排序列表,为每个测试编写一个算法,该算法将确定该测试的值是否在列表中,然后给出摊销复杂性(基本上,整个事情的复杂性除以我们运行的测试)

那么最好的答案是:首先对列表进行排序,花费
O(logn)
时间,但我们可以将其分摊到测试用例计数上,然后对每个单独的测试使用二进制搜索,添加
O(logn)
每项测试的复杂性。如果我们将输入列表的大小和测试的数量称为
n

O((n logn)/t+O(logn))

这是问题的实际答案,虽然看起来很复杂。但是,如果t很大,甚至被认为是无限大,或者我们在问题上增加了一个附加条件:

[1]中的列表是预先提供给您的,在合理的时间和内存限制内,您可以预处理这些数据,而无需在测试用例中分摊这些成本

那么这就归结为
O(logn)
,因为t的大值使得
(nlogn)/t
因子接近零

在向你的朋友传达这一点时,考虑到我们没有在整个科学论文中讨论,有人可能会说:“二进制排序算法的算法复杂性是O(logn)”,即使这忽略了整个故事中的一大块内容

你按照第二种情况解释问题(输入未排序,输入包含要搜索的列表和值,没有多重测试子句)。说“二进制搜索是O(logn)”的人在第一种或第三种情况下工作。你们都是对的


注:第三个定义似乎异常复杂。但是,它符合常见的情况。例如,“我们已经整理了一份居住在城里的人们及其电话号码的列表,我们想把它们打印在一本大书中,目的是让这本书的收件者查找电话号码。我们预计在一次打印的生命周期内该镇的100000名居民将平均进行大约50次查询,总共有500万次查询这个列表。这意味着t=500万,n=200000(假设有20万人住在这里,其中一半人有电话簿)。插入这些号码并对电话簿进行排序以压倒性优势胜出,而不是以任意、未排序的顺序发布电话簿。即使是这样,你开始“放下”排序工作,也无法弥补这一损失,直到有几个人在打印本书之前快速查找了一些电话号码,以弥补你在排序方面所做的努力

但是时间复杂性意味着最坏的情况,排序数据不会包括在最坏的情况下吗?当然。这已经在我描述的所有内容中得到了解释。当人们说“二进制搜索需要O(logn)时间”时他们指的是已经排序好的数据的情况。我使用的是Tony Gaddis的Java早期对象。在这本书中,它说二进制搜索比顺序搜索更有效