數據結構-----數組:

1.數組中的概念:是一種線性表數據結構,使用連續的內存空間來存儲類型相同的數據。

(1)線性表:數據排列成一種線形結構 ,如(數組,鏈表,棧,隊列)。非線性表:(樹,圖,堆)

2.數組是如何實現根據下標索引隨機訪問數據元素的 ?

數組支持隨機訪問,根據數組下標隨機訪問的時間複雜度爲O(1),而不是說訪問數組的時間複雜度爲O(1),因爲即使爲排好序的數組,採用二分查找算法,時間複雜度也是O(logn)。

因爲數組採用的是連續的內存存儲空間,所以在數組中間插入和刪除數據元素時,之後的元素會進行搬移工作。

以int 類型的數組爲例:int [ ]  array = new int [10] ; 假設 該數組中的第一個元素的地址爲 1000 ,記爲 base_address

data_type_size 爲數組中每個元素所佔內存的大小 ,如:int 類型的數據 佔4個字節。

所以隨機訪問數組中某一個元素的尋址公式爲:a[ i ]_address = base_address + i * data_type_size

3. 改進數組中低效的“插入”和“刪除”操作的方法:

(1)插入:前提條件(不需要關注數組中元素的順序時):例如 需要將一個新的元素插入到第k個元素的位置,爲了避免k和k之後的元素全都向後移動,可以將第k個元素移動到數組的最後一位,然後將新的元素插入到第k個元素的位置

基於這種操作,在第k個位置插入新的元素的時間複雜度爲O(1),在快速排序中也有用到這種思想。

(2)刪除數據時:前提條件(不要求數組中數據的連續性):因爲在數組中間某一個位置執行刪除操作的話,每執行一次都會移動一次數據,對性能產生影響,如果我們可以採用將多次刪除操作集中處理的話,

例如 如果想要刪除 a b c 三個元素,那麼我們可以先記錄下來需要刪除的數據,當數據的空間不足時,在執行一個總的刪除操作,效率會有所提高。

這種操作也是採用到了JVM GC 中的標記清除算法。

4. 數組的訪問越界問題:

例如 一個數組 arr[] 中 有三個元素,但是訪問了第四個元素,那麼程序是否報錯取決於編譯器,比如在C語言中,程序會出現無限循環的狀態,但是在Java中,就會出現數組索引越界異常。

5. 使用Java中容器和基礎數組的場合:

Java中基於數組實現的容器,如 ArrayList ,他在底層封裝了數組的動態擴容,添加和刪除操作,如果在進行業務開發中使用ArrayList時,如果可以提前確定數組的容量,那麼在初始化時,儘量聲明容器的容量,避免頻繁的擴容操作。如果時進行底層的功能開發,那麼採用基礎的數組比較好。

 

 

 

 

 

發佈了42 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章