我知道无法对无序数组进行二进制搜索。
我也理解有序数组中二进制搜索的复杂性是O(log(n))
。
我可以问
二进制搜索(插入)的复杂性是什么?
有序数组?我从教科书中看到,它表明了复杂性
是O(n)
。为什么不是它O(1)
,因为它可以直接插入,就像它一样
线性搜索。
由于二进制搜索不能在无序列表中完成,为什么呢
可以进行插入,复杂度为O(N)
?
答案 0 :(得分:0)
插入列表复杂性取决于使用的数据结构:
线性数组
在这种情况下,您需要将插入索引中的所有项目移动一个项目,以便为新插入的项目腾出空间。这是复杂性O(n)
。
链接列表
在这种情况下,您只需更改上一个/下一个项目的指针,这样就是O(1)
现在,对于有序列表,如果要使用二进制搜索(如您所见),则只能使用数组。将项a0
插入到有序数组a[n]
中的bin搜索意味着:
找到a0
这是bin搜索部分,例如find index ix
,以便:
a[ix-1]<=a0 AND a[ix]>a0 // for ascending order
这可以通过O(log(n))
插入商品
因此您首先需要将所有项目i>=ix
移动一个来创建,然后放置该项目:
for (int i=n;i>ix;i--) a[i]=a[i-1]; a[ix]=a0; n++;
如您所见,这是O(n)
。
全部放在一起
所以O(n+log(n)) = O(n)
就是这个原因。
顺便说一句。搜索非严格有序的数据集是可能的(虽然它不再被称为二进制搜索)参见