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)。我喜欢您提到的场景,即需要在同一输入上搜索多次。感谢它真的很有帮助