Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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_Search - Fatal编程技术网

Java 大型未排序列表上的二进制搜索还是线性搜索?

Java 大型未排序列表上的二进制搜索还是线性搜索?,java,search,Java,Search,我知道在排序列表和大列表中,二进制搜索比线性搜索更有效,但是如果我们有一个大列表,但没有排序,会怎么样,我们使用线性搜索还是二进制搜索?二进制搜索的概念只适用于排序输入。只要研究一下它是如何工作的: 根据您最初的问题“未排序列表上的二进制搜索或线性搜索”,答案显然是线性搜索,因为二进制搜索无法使用 但是,您是否可能至少对输入结构有一些了解?如果是,您可以使用它来创建更好的解决方案。如果它是完全随机的,那么显然线性搜索是最好的。但您可以轻松地将搜索并行化,如图所示: 让我给你一个二进制搜索的小概

我知道在排序列表和大列表中,二进制搜索比线性搜索更有效,但是如果我们有一个大列表,但没有排序,会怎么样,我们使用线性搜索还是二进制搜索?

二进制搜索的概念只适用于排序输入。只要研究一下它是如何工作的:

根据您最初的问题“未排序列表上的二进制搜索或线性搜索”,答案显然是线性搜索,因为二进制搜索无法使用

但是,您是否可能至少对输入结构有一些了解?如果是,您可以使用它来创建更好的解决方案。如果它是完全随机的,那么显然线性搜索是最好的。但您可以轻松地将搜索并行化,如图所示:


让我给你一个二进制搜索的小概述。我选择一个介于1和100之间的随机数。你现在可以猜出这个数字了,我会告诉你我的数字是小于、等于还是大于你的猜测

二进制搜索现在将猜测搜索间隔的一半,50。我的回答是猜测太高了。搜索间隔现在是从1到49,二进制搜索现在是25。它会重复搜索,直到找到元素为止


如果您的输入是未排序的,那么这将不再起作用,因为如果我告诉您我的元素低于50,那么这并不一定意味着它存储在左到50,也可能存储在,因为输入是未排序的

下面是一张演示算法的图片(通过快速谷歌搜索找到):


在这种情况下,线性搜索将更加有效,因为它的复杂性是
O(n)


但是,对于二进制搜索,需要对数组进行排序。对于排序,最佳复杂度将是
O(nlogn)
,在
O(logn)
中进行搜索,添加后将得到
O(nlogn)
因此,显然,线性搜索在这里更好。

根据定义,二进制搜索只适用于排序序列。必须对二进制搜索的列表进行排序,这是一个先决条件,否则二进制搜索根本不起作用

所以,为了回答您的问题:关于未排序序列,线性搜索是一种方法

但是请记住,如果必须执行大量(比如M)搜索,则最好对列表进行一次排序,然后对其使用二进制搜索

假设您必须对长度为
N
的数组执行
M
搜索-

  • 使用线性搜索将花费
    N*M
    (M搜索每个成本N)
  • 排序+二进制搜索将花费
    O((N log N)+(log N)*M)
    ->
    (N log N)
    对列表进行排序,再加上
    M
    搜索每个成本
    log N

前者什么时候方便,后者什么时候方便?当
N*M>N log N+(log N)*M

在这种情况下,使用二进制搜索将毫无意义。所以答案是使用线性搜索。你的意思是问:“如果我们有一个大的未排序列表,对列表进行排序然后执行二进制搜索,还是只使用线性搜索更有效?”。在这种情况下,线性搜索会更好。@DonatPants-取决于要执行的线性搜索的数量。如果是
n
线性搜索,那么时间复杂度是O(n^2),在这种情况下,最好先使用时间复杂度O(n log(n))进行排序,或者如果可以使用基数排序,则为O(n)。我喜欢您提到的场景,即需要在同一输入上搜索多次。感谢它真的很有帮助