爲什麼數組都是從0開始?

我們所知的大部分編程語言中,數組都是從0開始的,但你是否思考過,爲什麼數組從0開始編號,而不是1開始呢?從1開始不是更符合我們的日常習慣嗎?

  • 什麼是數組
    數組(Array)是一種線性表數據結構。它用一組連續的內存空間,來存儲一組具有相同類型的數據。

線性表(Linear List),見名知意,線性表就是數組排成一條線一樣的結構。每個線性表上的數據只有前和後兩個方向,其實除了數組,鏈表、隊列、棧等也是線性表結構。
amelia_ csdn首發
而與之對立的概念就是非線性表,非線性表中有我們熟知的二叉樹、圖、堆等

連續的內存空間和相同的數據類型。 線性表+連續的內存空間(相同數據類型),造就了數組的快速訪問特性,當按照下標查找指定位置的數據時,時間複雜度達到了最優的 O(1),當訪問不確定的數組時時間複雜度爲 O(n)

有了上面的基本介紹,接下來我們拿一個長度爲 10 的 int 類型的數組 int[] a = new int[10] 來舉例。分配了一塊連續內存空間 100~139,其中,內存塊的首地址爲 first_address = 100。
amelia_  csdn首發
計算機會給每個內存成員分配一個地址,通過指定的地址來訪問內存中的數據,當計算機隨機訪問數組中的某個元素時會進行西面的方式來進行尋址:

a[i]_address = first_address + i * data_size

data_size 表示元素大小。

爲什麼大多數編程語言中,數組要從 0 開始編號,而不是從 1 開始呢?

從數組存儲的內存模型上來看,“下標”最確切的定義應該是“偏移(offset)”。前面也講到,如果用 a 來表示數組的首地址,a[0] 就是偏移爲 0 的位置,也就是首地址,a[i] 就表示偏移 i 個 data_size 的位置,所以計算 a[i] 的內存地址只需要用這個公式:

a[i]_address = first_address + i * data_size

但是,如果數組從 1 開始計數,那我們計算數組元素 a[i] 的內存地址就會變爲:

a[i]_address = first_address + (i-1) * data_size

從 1 開始編號,每次隨機訪問數組元素都多了一次減法運算,對於 CPU 來說,就是多了一次減法指令。

數組作爲非常基礎的數據結構,通過下標隨機訪問數組元素又是其非常基礎的編程操作,效率的優化就要儘可能做到極致。所以爲了減少一次減法操作,數組選擇了從 0 開始編號,而不是從 1 開始。

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