Object & Array & Linked List BigO

Array


  1. Insert插入(push) → O(1)
  1. Insert插入(shift) → O(n)
  1. Remove移除(pop) → O(1)
  1. Remove移出(unshift) → O(n)
  1. Searching查詢 → O(n)
  1. Accessing(arr[6]) → O(1)
 

Object


  1. Insert插入 → O(1)
  1. Remove移除 → O(1)
  1. Searching查詢 → O(1)
  1. Accessing → O(1)
 

Linked List


  1. Insert插入(push) → O(n)無尾針,O(1)有尾針
  1. Insert插入(shift) → O(1)
  1. Remove移除(pop) → O(n)
  1. Remove移出(unshift) → O(1)
  1. Searching查詢 → O(n)
 

Array

優點 :

  • 資料存取查詢 by random access:在array中只需要利用index即可對特定位置的資料作存取與查詢,此動作之時間複雜度為O(1)。
  • 較linked list節省記憶體空間:linked list需要額外的記憶體空間來儲存指到下一個node的pointer。例如: node的data element為4bytes的int,但是pointer element也需要4bytes空間來儲存下個node的記憶體位置,這樣就多費了1倍的記憶體空間在儲存非真正要處理的資料上,較無效率。

缺點

  • 沒有像linked list 能動態新增和刪除元素的資料結構特性 : array 的元素在記憶體中是連續儲存的,而linked list的元素為非連續儲存的。所以假設要新增array的第1個位置的元素,則須將第2~last位置的元素一一往後搬動,時間複雜度為O(N)。同理,若要刪除第1個位置的資料,也需O(N)時間把array中剩餘的元素一一往前搬動。
  • 若資料數量時常在改變,要時常調整array的大小,需花費O(N)時間在搬動資料from old-array to new-array上。

— 使用時機 :

  • 希望能夠快速存取查詢資料,時間複雜度只有O(1)。
  • 已知欲處理的資料數量,便能確認array的大小。
  • 要求記憶體空間的使用越少越好。

Linked list

優點 :

  • 增加or刪除資料較array簡單,只要對O(1)個node(所有與欲新增/刪除的node有pointer相連的node)調整pointer指向的node即可,不需要像array搬動一堆其餘元素。若是在linked list的head新增node,只需O(1)的時間複雜度。若想在特定位置新增or刪除node,會需要先作O(N)搜尋到特定node後,再作新增or刪除node的動作。
  • Linked list的資料數量可以是動態的,不像array會有amortization的resize問題。

缺點 :

  • 因為linked list沒有index,若要存取查詢(access)特定node的資料,可能會需要從頭開始找,故access的搜尋時間複雜度為O(N)。
  • 需要額外的記憶體空間來儲存指到下一個node的pointer

—使用時機 :

  • 無法預期資料數量時,使用linked list就沒有resize的問題。
  • 需要頻繁地新增/刪除資料時。
  • 不需要快速存取查詢資料時。