Big O表示法数组与链接表单插入

20 big-o data-structures

Big O表示法数组与链接表单插入:

根据阵列的学术文献,它是常数O(1),对于链表,它是线性O(n).

一个数组只需要一次乘法和加法.

没有在连续内存中布局的链表需要遍历.

这个问题是,O(1)和O(n)分别准确地描述了数组和链表的索引/搜索成本吗?

wkl*_*wkl 38

O(1)准确地描述了在数组末尾的插入.但是,如果要插入数组的中间,则必须在该元素之后移动所有元素,因此在这种情况下插入的复杂性适用于O(n)数组.如果数组已满,则必须对数组进行大小调整.

对于链表,您必须遍历列表才能进行中间插入,这样就可以了O(n).您不必将元素向下移动.

维基百科上有一个很好的图表:http://en.wikipedia.org/wiki/Linked_list#Linked_lists_vs._dynamic_arrays

                          Linked list   Array   Dynamic array   Balanced tree

Indexing                          ?(n)   ?(1)       ?(1)             ?(log n)
Insert/delete at beginning        ?(1)   N/A        ?(n)             ?(log n)
Insert/delete at end              ?(1)   N/A        ?(1) amortized   ?(log n)
Insert/delete in middle     search time 
                                + ?(1)   N/A        ?(n)             ?(log n)
Wasted space (average)            ?(n)    0         ?(n)[2]          ?(n)
Run Code Online (Sandbox Code Playgroud)

  • @Crowie - 它确实有它,它是`搜索时间+ O(1)',其中搜索时间遍历列表(大致`为O(n)')和插入是一个`O(1)'的操作. (2认同)