2011-12-11 5 views
3

インデックスを反復することなく、インデックスに値を直接マップする方法はありますか?アレイは一般的にどのように低レベルで動作しますか?

かなり複雑な場合はどこでもっと読むことができますか?

+2

各要素が 'n 'バイトの場合、' ith'要素は 'start +(n * i)'に配置されます。 –

+1

大学レベルのデータ構造とアルゴリズムのテキストブックは、すべてのcomp sciの基礎(配列、リンクリストなど)について説明します。誰もMattのための良い、低コストの提案を持っていますか? – Aardvark

+0

@Aardvark Wikipedia。それはすべてを持っています – Jon

答えて

4

本質的に、コンピュータメモリは、一連のアドレス指定されたスロットとして説明することができます。配列を作成するには、それらの連続したブロックを確保します。したがって、アレイに50個のスロットが必要な場合は、メモリから50個のスロットを確保します。この例では、Aという配列の1019から1068までのスロットを脇に置いておきましょう。Aのスロット0はメモリのスロット1019です。 Aのスロット1は、メモリ内のスロット1020である。 Aのスロット2はメモリ内のスロット1021であり、以下同様である。ですから、一般に配列のn番目のスロットを取得するには、1019 + nを実行します。だから私たちがする必要があるのは、開始スロットが何であるかを覚えて、それに適切に追加することだけです。

私たちが配列の終わりを超えてメモリに書き込まないようにしたい場合は、Aの長さを格納し、それに対してnをチェックすることもできます。また、追跡したい値がすべて同じサイズであるわけではないので、配列内の各項目が複数のスロットを占める配列を持つこともあります。その場合、sが各アイテムのサイズであれば、配列内のアイテムの数をs倍に設定する必要があり、n番目のアイテムをフェッチするときは、nよりもむしろ開始時刻にs時間nを追加する必要があります。しかし実際には、これは扱いが非常に簡単です。唯一の制約は、配列内の各アイテムが同じサイズであることです。

+0

これをコミュニティウィキ、その一般的な情報にすることを検討してください。 – Jon

4

アレイは、いくつかの既知のアドレスから始まるメモリの単なる連続チャンクです。開始アドレスがpあり、そしてあなたがi番目の要素にアクセスしたいのであれば、あなたは、単に計算する必要があります。

size
p + i * size 

は、各要素のサイズ(バイト単位)です。

厳密に言うと、任意のメモリアドレスへのアクセスには一定の時間がかかります。

1

ウィキペディアは非常によく、これを説明する:

http://en.wikipedia.org/wiki/Array_data_structure

基本的には、メモリベースが選択されています。次に、索引がベースに追加されます。そうのような:

base = 2000, size-of-each = 5 bytes 
array[i][j] is at 2000 + 5*i*j 

を、すべてのインデックスが異なるサイズである場合、より多くの計算が必要である:

if base = 2000 and the size of each element is 5 bytes, then: 
array[5] is at 2000 + 5*5. 
array[i] is at 2000 + 5*i. 

二次元配列はそうのように、この効果を乗算

for each index 
    slot-in-memory += size-of-element-at-index 

したがって、この場合、繰り返しなしで直接マップすることはほとんど不可能です。

関連する問題