算法基礎-數組

收穫點滴:

1.數組的查詢效率比鏈表高?

答:哪怕排好序的數組,利用二分法查詢時間複雜度也是 O(logn)。所以,正確的表述應該是,數組支持隨機訪問,根據下標隨機訪問的時間複雜度爲 O(1)。

2.數組插入和刪除的效率低?

答:對於實際上,在某些特殊場景下,我們並不一定非得追求數組中數據的連續性。如果我們將多次刪除操作集中在一起執行,刪除的效率是不是會提高很多呢?,如果數組只是存儲數據的容器,存儲的數據沒有任何規律,這時需要把某個數插入到第K個位置,這時爲了避免大規模數據移動,把第K個數移到數組末尾,在把新元素放置到K位置。
在這裏插入圖片描述
對於刪除操作,實際上,在某些特殊場景下,我們並不一定非得追求數組中數據的連續性。如果我們將多次刪除操作集中在一起執行,刪除的效率是不是會提高很多呢?
我們繼續來看例子。數組 a[10] 中存儲了 8 個元素:a,b,c,d,e,f,g,h。現在,我們要依次刪除 a,b,c 三個元素。
在這裏插入圖片描述
爲了避免 d,e,f,g,h 這幾個數據會被搬移三次,我們可以先記錄下已經刪除的數據。每次的刪除操作並不是真正地搬移數據,只是記錄數據已經被刪除。當數組沒有更多空間存儲數據時,我們再觸發執行一次真正的刪除操作,這樣就大大減少了刪除操作導致的數據搬移。

3.容器能否完全替代數組?

1.Java ArrayList 無法存儲基本類型,比如 int、long,需要封裝爲 Integer、Long 類,而 Autoboxing、Unboxing 則有一定的性能消耗,所以如果特別關注性能,或者希望使用基本類型,就可以選用數組。
2. 如果數據大小事先已知,並且對數據的操作非常簡單,用不到 ArrayList 提供的大部分方法,也可以直接使用數組。
3. 還有一個是我個人的喜好,當要表示多維數組時,用數組往往會更加直觀。比如 Object[][] array;而用容器的話則需要這樣定義:ArrayList > array。我總結一下,對於業務開發,直接使用容器就足夠了,省時省力。畢竟損耗一丟丟性能,完全不會影響到系統整體的性能。但如果你是做一些非常底層的開發,比如開發網絡框架,性能的優化需要做到極致,這個時候數組就會優於容器,成爲首選。

4.爲什麼數組要從0開始編號?

因爲數組的首地址是數組第1個元素存儲空間的起始位置,若用下標0標記第1元素則通過尋址公式計算地址時直接使用下標值計算,即a[0]_address = base_address + 0 * data_type_size。若用下標1標記第1個元素則通過尋址公式計算地址時需將下標值減1再計算,即a[1]_address = base_address + (1-1) * data_type_size,這樣每次尋址計算都多了一步減法操作,增加了性能開銷。不過也有可能是歷史原因,因爲之前C語言就是0開始的,Java爲了減少學習成本,所以繼續沿用從0開始計數的習慣。

5.Java的二維數組地址是連續的麼?

二維數組A:
int [][] A = { { 1, 0, 12, -1 },
{ 7, -3, 2, 5 },
{ -5, -2, 2, -9 }
};
內存結構如圖:
在這裏插入圖片描述
參考:http://math.hws.edu/javanotes/c7/s5.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章