問題解析:為什麼數組下標從0 開始而不是 1 ?
正文
很多小夥伴初學編程的時候都被元素下標折磨過,為什麼很多編程語言要把 0 作為第一個下標索引,而不是直觀的 1 呢?
這個問題 Dijkstra 已經解答過瞭,沒錯,就是你知道的 Dijkstra,Dijkstra 最短路徑算法,荷蘭語全名是 Edsger Wybe Dijkstra,於 1972 年獲得瞭圖靈獎,除瞭上面說的最短路徑算法,還有眾所周知的信號量和 PV 原語、銀行傢算法等也是這位巨佬提出的。
原文在這裡:https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
感興趣的小夥伴可以去看下全文,下面我總結幾段核心的觀點:
首先來看個案例
如何用一個不等式(或者說表達式)來表示 [2,3,4,5,6,7,8,9,10,11,12]
這個連續的整數序列(一共 11 個數)?
假設 i
是一個整數,那麼我們能夠迅速地寫出如下四個符合上述連續序列的不等式:
1)2 <= i < 13
2)1 < i <= 12
3)2 <= i <= 12
4)1 < i < 13
以上四個不等式均滿足要求,那是否有理由選擇其中的一種而不是另一種?
Dijkstra 說有理由的,選 1 和 2,因為這倆不等式有個很突出的優點,就是不等式邊界的差(不等式右邊 – 不等式左邊)正好等於連續序列的長度
這裡可以排除掉 3 和 4,那麼 1 和 2 該如何選出最優的表示?
1 和 2 不等式的區別
-
1 不等式左邊(下界)等於序列中的最小值,不等式右邊(上界)大於序列中的最大值
-
2 不等式左邊(下界)小於序列中的最小值,不等式右邊(上界)等於序列中的最大值
對於第 2 個不等式來說,下界小於序列中的最小值,這會出現一個問題,比如我們的連續序列是 [0,1,2,3,4]
那麼按照第 2 個不等式的寫法,不等式的左邊就是 -1,-1 是非自然數,而我們需要表示的連續序列是自然數序列,所以第 2 個不等式很不優雅:我們需要用一個 非自然數 來作為 全是自然數的序列 的下界
因此,綜上所述,不等式 1 是最優雅的選擇。
那麼,選出一個看著非常順眼的不等式來表達長度為 N 的連續序列之後,下一個令人煩惱的問題是該為起始元素分配什麼下標值?
遵循不等式 1 的規則:
- 當從下標 1 開始時,下標范圍
1 ≤ i < N+1
- 當從下標 0 開始時,下標范圍
0 ≤ i < N
哪個更優雅?
Dijkstra 是這樣解釋的:從下標 0 開始能夠給出更好的不等式,因為元素的下標就等於序列中它前面的元素數(或者說 “偏移量”)。
問題解決!文末貼上巨佬 Dijkstra 的手稿:
以上就是問題解析:為什麼數組下標從0 開始而不是 1 ?的詳細內容,更多關於數組下標問題的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Dijkstra算法與Prim算法的異同案例詳解
- 實現Dijkstra算法最短路徑問題詳解
- 詳解Dijkstra算法之最短路徑問題
- 詳解MySQL中事務隔離級別的實現原理
- 使用Jacoco獲取 Java 程序的代碼執行覆蓋率的步驟詳解