なぜ配列インデックスはほとんど0から始まりますか?


あなたはなぜ配列インデックスはほとんどの言語で0で始まるのだろうか?私.この好奇心を満たす道は、私たちが多くの時間を忘れる傾向があるいくつかの啓示と基礎を導きました.配列を定義することから始めましょう.
アレイは典型的にはコンピュータメモリ内の隣接する領域である.ほとんどの言語では、この配列を参照するために使用する変数はポインタです.メモリの隣接部分の開始アドレスを格納するポインタ.
例えば、すべての整数が2バイトのメモリを占める言語で、5つの数字のarrの整数配列があるとしましょう.この配列の隣接する領域はバイトアドレス44で始まり、54まで続く(10バイト、すなわち2バイトの5つの整数を必要とする).
この範囲内で、arr[i]を参照するとき、私たちは本質的に、簡潔な方法でメモリ位置を調べています.
arr[i] points to a location = Start Address + Data size * Index
arr[0] points to a location = 44 + 2*0 = 44
arr[1] points to a location = 44 + 2*1 = 46
arr[2] points to a location = 44 + 2*2 = 48
arr[3] points to a location = 44 + 2*3 = 50
arr[4] points to a location = 44 + 2*4 = 52
0の代わりに1で始まったのはどんな違いでしょうか?
arr[i] points to a location = Start Address + Data size * (Index - 1)
arr[1] points to a location = 44 + 2*(1-1) = 44
arr[2] points to a location = 44 + 2*(2-1) = 46
arr[3] points to a location = 44 + 2*(3-1) = 48
arr[4] points to a location = 44 + 2*(4-1) = 50
arr[5] points to a location = 44 + 2*(5-1) = 52
インデックスを1から始めると、アクセスしているすべてのインデックスから1を減算する必要があります.熱心に見て、我々はインデックスを開始することからすべての要素を得るために不快になっています.インデックスとして0を使用すると、インデックスとして出発点からの正確なオフセットを使用することになります.一方、1を使用する場合、オフセット自体を計算する必要があります.
なぜ0を使用するか?0を使用すると、要素にアクセスするための計算が1つ少なくなります.これはそんなに重要ですか.今日ではなく、おそらく最も効率的な方法でアルゴリズムを持っているコンピューティングの初期の段階で熟考.多分、それは古代のコンピュータのための効率ハックでした.
これだけでなく、それはまた、0ベースのインデックスを使用する数学的な意味になります.私はここではるかに深く潜んでいませんが、自然の数のシーケンスを表す規則を使用して、それをtake home this pointにダイクストラに任せます.
0ベースのインデックスの単純な選択は、プログラマのための配列上の多くの数学を簡素化し、ハッシュテーブル、一貫したハッシュ、およびバイナリヒープのようないくつかの概念のいくつかのエレガントな実装を可能にします.
それにもかかわらず、計算効率や数学的な精度の決定よりも、それは言語の選択の問題です.配列の実装でいくつかの調整を行うと、任意のインデックス作業を行うことができます.