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

时间:2017-07-23 17:23:18

标签: java sorting search binary linear

我了解二进制搜索排序列表中的线性搜索和一个大列表更有效,但是如果我们怎么办?有一个很大的列表,但未排序,我们使用线性搜索或二进制搜索?

3 个答案:

答案 0 :(得分:1)

二进制搜索的概念只适用于已排序的输入。只需研究它的工作原理:Binary search at Wikipedia

根据您的原始问题“二进制搜索或未排序列表上的线性搜索?”答案显然是线性搜索,因为二进制搜索可以不被使用。

但是,您至少可以输入结构一些知识吗?如果,您可以使用它来创建更好的解决方案。如果它是完全随机的,那么显然线性搜索是最好的。但您可以轻松地对搜索进行并行化,如下所示:Fastest way to search for an element in unsorted array

让我给你一个二进制搜索的小概述。我在 1到100 之间选择一个随机数。您现在可以猜出这个号码,我会告诉您我的号码是否低于,等于或大于您的猜测。

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

如果您输入未排序,那么这将不再有效,因为如果我告诉您我的元素低于 50 那么它并不一定意味着它已存储左侧为50 ,也可能向右,因为输入未排序

这是一张说明算法的图片(通过快速Google搜索找到):

enter image description here

答案 1 :(得分:1)

根据定义,

二进制搜索仅适用于已排序的序列。先前必须对二进制搜索的列表进行排序,否则二进制搜索根本不起作用。

所以回答你的问题:关于未排序的序列线性搜索是要走的路

但是请记住,如果你必须执行一个(比如说M)搜索,那么对列表进行一次排序然后在其上使用二进制搜索可能会很好。

想象一下,您必须对长度为M的数组执行N次搜索。 -

  • 使用线性搜索将花费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

答案 2 :(得分:0)

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

但是,对于二进制搜索,数组需要排序。对于排序,最佳复杂度为O(nlogn),搜索位于O(logn),添加时会显示O(nlogn)

所以,显然线性搜索在这里更好。