二阶搜索(插入)对于有序列表的复杂性

时间:2016-04-10 05:11:26

标签: arrays algorithm binary-search

我知道无法对无序数组进行二进制搜索。 我也理解有序数组中二进制搜索的复杂性是O(log(n))

我可以问

  1. 二进制搜索(插入)的复杂性是什么? 有序数组?我从教科书中看到,它表明了复杂性 是O(n)。为什么不是它O(1),因为它可以直接插入,就像它一样 线性搜索。

  2. 由于二进制搜索不能在无序列表中完成,为什么呢 可以进行插入,复杂度为O(N)

1 个答案:

答案 0 :(得分:0)

插入列表复杂性取决于使用的数据结构:

  1. 线性数组

    在这种情况下,您需要将插入索引中的所有项目移动一个项目,以便为新插入的项目腾出空间。这是复杂性O(n)

  2. 链接列表

    在这种情况下,您只需更改上一个/下一个项目的指针,这样就是O(1)

  3. 现在,对于有序列表,如果要使用二进制搜索(如您所见),则只能使用数组。将项a0插入到有序数组a[n]中的bin搜索意味着:

    1. 找到a0

      的位置

      这是bin搜索部分,例如find index ix,以便:

      a[ix-1]<=a0 AND a[ix]>a0 // for ascending order
      

      这可以通过O(log(n))

    2. 中的bin搜索来完成
    3. 插入商品

      因此您首先需要将所有项目i>=ix移动一个来创建,然后放置该项目:

      for (int i=n;i>ix;i--) a[i]=a[i-1]; a[ix]=a0; n++;
      

      如您所见,这是O(n)

    4. 全部放在一起

      所以O(n+log(n)) = O(n)就是这个原因。

    5. 顺便说一句。搜索非严格有序的数据集是可能的(虽然它不再被称为二进制搜索)参见