Android框架結構優化;資料結構(陣列)

定義
陣列(Array)是一種線性表結構,它用一組連續的記憶體空間來儲存一組具有相同型別的資料。
在這個定義中有幾個關鍵詞:
線性表
所謂線性表就是資料會排成像一條線一樣的結構。也就是說線性表中資料元素之間的關係是一對一的關係,即除了第一個和最後一個數據元素之外,其它資料元素都是首尾相接的。
線性表包括:順序表和連結串列
順序表裡面元素的地址是連續的,比如陣列或者用陣列實現的佇列、棧等
連結串列裡面節點的地址不是連續的,是通過指標連起來的.如下圖所示:
線性表具體解釋可以參考 線性表
而與線性表隊裡的概念就是費線性表,比如二叉樹、堆、圖等等。之所以叫非線性表是因為,在非線性表中資料之間並不是一對一的前後關係,如下所示:

連續記憶體空間&相同型別
正是基於這種定義的限制,因此可以只需要計算出陣列中某一元素相對於首地址(base_address)的偏移量,就可以很方便的計算出這個元素的地址。
以一個長度為4的int型別的陣列 int[] arr = new int[4]; 為例。在初始化這個陣列時,計算機會給陣列arr分配一塊連續的記憶體空間 1000~1015,其中首地址為base_address = 1000, 如下圖所示:
計算機會給每個記憶體單元分配一個實體地址,然後計算機通過這些實體地址來訪問記憶體中的資料。當計算機需要訪問陣列中的某個元素是,就可以通過下面的定址公式,計算出該元素的記憶體地址:
arr[i]_address = base_address + i * data_type_size
其中i 代表需要訪問的元素下標,base_address代表首地址,data_type_size_代表每個元素佔用的記憶體大小,比如陣列中儲存的是java的int型別,所以data_type_size_也就是4個位元組。
陣列的基本操作
- 插入操作
- 刪除操作
- 查詢操作
插入操作
插入操作有兩種情況。
在陣列的末尾插入元素
如果是在末尾插入操作,不需要移動任何元素的位置,直接在陣列最後位置新增上一個新的元素即可。因此在陣列末尾插入資料的時間複雜度為 O(1)
在陣列頭部插入元素。
如果是在開頭位置插入元素,那為了保持記憶體資料的連續性,所有的資料都需要依次往後移動一位,所以最壞時間複雜度為 O(n)
刪除操作
和插入元素類似,如果要刪除陣列中第K位置的資料,為了保持記憶體的連續性,需要將K + 1到最後一個元素的位置都向前移動一位。同樣也分兩種情況
刪除陣列末尾元素
最好時間複雜度為 O(1)
刪除陣列頭部元素
最壞時間複雜度為 O(n)
隨機訪問
當我們已經知道某元素在陣列中的下標時,我們就可以直接通過下標來訪問此元素,比如假設我們已經知道數字 23 在陣列 [10, 15, 23, 45] 的下標是 2, 所以我們可以直接通過 arr[2]來指向23。因此陣列隨機訪問的時間複雜度是O(1)
查詢操作
假設我們需要在陣列 [10, 15, 23, 45] 中查詢是否有 23時,因為我們不知道元素23所處的下標是多少,因此需要從頭到尾依次遍歷陣列中的每一個元素,並判斷是否等於23。程式碼可以如下:
for (let index = 0; index < array.length; index++) { if(element === array[index]) { return index; } } 1 2 3 4 5
因此陣列中查詢某元素的時間複雜度為 O(n)
陣列時間複雜度總結

附錄
Android高階技術大綱,以及系統進階視訊;

Android高階技術大綱

Android高階進階視訊資料
獲取方式;