資料結構與演算法120—陣列(陣列為什麼從0開始)
更多內容訪問:www.lifesmile.cn
一、陣列為什麼從0開始?
提到陣列很多人都會覺得非常簡單,是的,使用起來非常簡單。但是我相信很多人都沒有理解到它的精髓。比如說陣列為啥要從0開始而不是1開始呢?
二、什麼是陣列?
陣列是一種線性表資料結構,它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。
線性表:顧名思義就是連成一條線,線上的資料只有前後方向,後面還會講到連結串列、佇列、棧都是線性表結構。而非線性表則是資料之間並不只有簡單的前後關係,比如樹。
連續的記憶體空間和相同型別:因為這2個限制才成就了陣列能隨機的訪問,有得必有失,這樣的設計也造成了對陣列進行插入和刪除需要做大量的遷移工作,導致效能方面偏低。
三、怎麼實現隨機訪問?
上面提到了連續和相同型別:那麼我們來模擬一個int[] a = new int[10]的陣列在記憶體的空間:
a[0] 地址:1000-1003 |
a[1 ]地址:1004-1007 |
.... |
.... |
a[9]地址:1036-1039 |
這裡用的int佔4個位元組,假如地址是上面的地址,那麼通過索引就能知道所有的元素在記憶體中的地址,公式如下:
a[i]_address = base_address + i * data_type_size,其中data_type_size是資料型別佔得記憶體,base_address基礎地址。所以我們能對陣列進行隨機訪問,只要知道對應的索引,通過公式就知道對應的記憶體地址。
四、如何優化插入與刪除?
1.插入優化
我們都知道陣列查詢效率很高,插入和刪除效率很低,理由就是在插入和刪除時要對剩下的進行遷移。那麼在插入時怎麼優化,提高效率呢。
這裡有一個思路:比如一個數組有元素a,b,c,d,e 現在要在第三個位置也就是b後面插入一個x,我們可以把c位置的值賦值為x,並且在陣列最後插入一個c,這樣陣列就沒有進行資料遷移。變成了a,b,x,d,e,c
2.刪除優化
刪除優化和插入優化一樣,避免進行資料遷移。比如陣列,a,b,c,d,e現要刪除a,b。我們可以把a,b進行刪除標記,等一段時間後統一進行移除,這個道理如同JVM GC的標記清除法。變多次陣列的資料遷移為一次。
五、解答為什麼陣列從0開始?
現在解答第一個問題,為什麼從0,因為一開始設計師設計就是這樣的,有啥辦法。
是不是不服?現在從另一個角度來看吧,我們知道隨機訪問地址的公式是a[i]_address = base_address + i * data_type_size,
假如陣列從第一個開始那麼公式就會改為:a[i]_address = base_address + (i-1) * data_type_size,這樣每次在進行訪問的時候都會進行i-1計算,增加了計算機的計算負擔,這只是一種自欺欺人的理解吧。具體為啥從0開始,鬼曉得,為啥要說這個問題,還不是為了增加點選量。
文章是自己在網上學習後簡單整理的學習筆記,若有侵權請及時聯絡刪除。