1. 程式人生 > >資料結構與演算法120—陣列(陣列為什麼從0開始)

資料結構與演算法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開始,鬼曉得,為啥要說這個問題,還不是為了增加點選量。

文章是自己在網上學習後簡單整理的學習筆記,若有侵權請及時聯絡刪除。