我了解二进制搜索比排序列表中的线性搜索和一个大列表更有效,但是如果我们怎么办?有一个很大的列表,但未排序,我们使用线性搜索或二进制搜索?
答案 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搜索找到):
答案 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)
。
所以,显然线性搜索在这里更好。