數據結構和算法之美總結——數組

插入操作

  1. 如果在數組的末尾插入元素,那就不需要移動數據了,這時的時間複雜度爲 O(1)。但如果在數組的開頭插入元素,那所有的數據都需要依次往後移動一位,所以最壞時間複雜度是 O(n)
  2. 如果數組有序,那麼當插入新的元素時候,後面的k位元素都要移動。
  3. 如果無序,那麼直接替換第k個元素,然後將被替換的元素放到數組最後。時間複雜度就會降低

刪除操作

  1. 當需要刪除一個元素時候,所有的元素都需要向前移動一位,不然就會造成內存空間不連續。如果刪除多個元素的話,那麼時間複雜度會更高。
  2. 先記錄下已經刪除的數據或者下標,不是真正意義上刪除。當數組沒有多餘的內存空間的時候,根據已經記錄的數據或者下標執行一次真正意義上的刪除操作。這樣減少了刪除操作導致的數據搬移。
    注:這個和JVM標記清除法的核心思想是一致的

實際應用

  1. Java ArrayList
    Java ArrayList 如果說往數組中插入很多的數據的話,實際應用中應該指定數組大小。這個和Hashmap一樣,支持動態擴容,擴容倍數是1.5倍。
  2. 擴容操作涉及內存申請和數據搬移,是比較耗時的。所以,如果事先能確定需要存儲的數據大小是最好的。
ArrayList users = new ArrayList(10000);
for (int i = 0; i < 10000; ++i) { 
	users.add(xxx);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章