【问题标题】:Complexity for Binary Search (Insertion) for an ordered list有序列表的二进制搜索(插入)的复杂性
【发布时间】:2016-07-31 06:42:14
【问题描述】:

我了解无法对无序数组进行二进制搜索。 我也明白有序数组中二分查找的复杂度是O(log(n))

我可以问一下

  1. 二分查找(插入)的复杂度是多少? 有序数组?我从一本教科书上看到,它指出复杂性 是O(n)。为什么不是O(1),因为可以直接插入,就像 线性搜索。

  2. 既然在无序列表中不能进行二分查找,为什么会这样 可以插入,复杂度为O(N)?

【问题讨论】:

    标签: arrays algorithm binary-search


    【解决方案1】:

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

    1. 线性阵列

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

    2. 链表

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

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

    1. 查找放置a0

      的位置

      这是 bin 搜索部分,例如查找索引 ix,这样:

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

      这可以通过O(log(n))中的bin搜索来完成

    2. 插入项目

      所以您需要先将所有项目 i&gt;=ix 移动一个以放置,然后再放置项目:

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

      如您所见,这是O(n)

    3. 放在一起

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

    顺便说一句。可以对非严格排序的数据集进行搜索(尽管不再称为二分搜索),请参阅

    【讨论】:

    • 线性数组是指二分查找,链表是指线性查找?
    • 对于链表插入,复杂度不应该是O(n)吗?因为虽然它是有序的,但它可能会插入到最后一个位置
    • @overflow 是的,您是对的,但是您正在混合插入和搜索操作,它们是两个独立的操作。查看我重新编辑以匹配您的问题的答案
    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 2012-03-16
    • 2013-02-25
    • 2011-05-02
    • 2016-08-29
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多