迪克斯特拉
我為使用基于0的數組而後悔,我錯了。 讓我與您分享為什麼。
程式員應該使用索引符号 ,而不是偏移量符号。 偏移表示法是通過在連續記憶體的實體配置設定空間中從實體上配置設定的空間中的元素的對應位置來描述元素在數組中的位置的常用方法,該邏輯上從零開始。 否則它會縮短為“基于0的索引數組”,盡管它的誤稱實際上是偏移量。 我們應該改用1作為數組的開頭,因為它具有以下優點:
- 自然,清單中的第一個元素基本對應于
。 相反,即使JavaScript的官方文檔也明确聲明免責聲明“數組的第一個元素實際上位于索引0”-這很容易被忘記,尤其是對于新手而言,并且可能導緻錯誤。1
- 在數學上,一個封閉的間隔在代碼中正确表示為
,因為它包含其端點。 偏移符号從技術上講是一個左向右開的間隔集,在代碼中表示為for(i = 1; i <= items.length; i++)
。 這很重要,因為代碼處理整數間隔,因為所有元素都有固定的大小-您無法通路元素的小數部分。 整數間隔是封閉間隔,是以可以證明這一點。for(i = 0; i < items.length; i++)
- 在數學上,矩陣符号也從
開始。1
- 那麼第 個項目應該代表什麼? 數組本身如何? 特别是對于将 視為假值的語言,如果
0 || true
表示您為true,認為0 || true
為您提供foo的根(即數組本身)并非沒有道理。foo[0]
- 清單中的最後一個元素基本對應于清單的長度,是以可以輕松地使用
進行通路,而無需在代碼中的各處都使用令人沮喪的items.length
算法。(items.length - 1)
- 負指數與正指數對稱。 這樣
和-1
分别引用最後一個元素和第一個元素,并且在清單中隻有一個項目的情況下,它比對相同的元素。 這種便利性允許不提供偏移量表示法的簡單左右通路。1
- 元素的不存在可以用 表示,它将友善地優雅地進行編碼,
。 相反,必須決定是否if( !items.indexOf('z') ) return;
從哲學if( items.indexOf('z') == -1 ) return;
比if( items.indexOf('z') < 0 ) return;
更有意義if( items.indexOf('z') < 0 ) return;
盡管忽略了方程的不對稱性,但使用偏移符号表示。if( items.indexOf('z') < 0 ) return;
是以,我要求原諒我多年來天真,愚蠢和錯誤地強加給每個人的基于0的數組。 請原諒我,與我悔改,現在起來反抗! 分享,發推,HN / Reddit等動作,讓我們再次使陣列變得很棒 ! 不,我不是在拖釣, 數學已經講完了 。
翻譯自: https://hackernoon.com/dijkstra-is-wrong-and-so-am-i-f36e2fbd5ae4
迪克斯特拉