aokikatosasakitanakanodafukuda |
順序づけられたデータ--リスト--をコンピュータープログラムで取り扱う場合,配列あ るいはリストと呼ばれるデータ構造が使われる2.例えば,数列
配列の場合,図3のようにしてデータを挿入する.後ろの方からひ とつずつ,右側に値をコピーする.そして,データを挿入する場所にあった値をのコピー が終われば,そこに挿入する値をコピーする.挿入する場所にもよるが,データ数に比例 してコピーの手間は増える.データ数をとするとコピーの回数--コンピューターの処 理回数--は,程度である.もちろん,コピー回数は挿入する場所にも依存するが, 平均してとなる.これをと表現する.「オーダー」と読む.に比例し て処理の回数が増える-- ということを表している.
それに対して,リストの場合は図4のようにしてデータを挿入する. データ63のポインターを99に接続し,データ99のポインターを27に接続する.この方法だ と,データがいくらあっても処理の回数は同じである.である.配列に比べて,処 理の回数は少なく,コンピューターで高速の処理ができる.データ数が多くなるとその差 は顕著になる.
配列とリストではデータを挿入する場合,処理の回数が決定的に異なる.リストの方が処 理の回数が少ない.処理の回数が異なるのは,データのメモリーへの格納の仕方による. 配列は頑固に,データと同じ並びで連続した領域に,値を格納する.一方,リストはメモ リーに適当に格納して,順序を表すポインターを使う.
配列の場合,図5に示した方法で,データを削除する.挿入とは逆に, 前の方から順番にコピーを繰り返す.最後のデータ--図5の最後の 12--は意味のないデータとなる.このような方法では,データの数とすると平均して 回の処理が必要である.したがって,となる.
リストの場合,図6に示した方法で,データを削除する.データ63のポ インターをデータ27に接続して,データ99を削除する.データ数とは関係なく処理の回数 は決まっており,オーダーはとなる.配列よりも高速な処理ができ,データ数が多 くなればその差は顕著になる.
配列の場合,a[3]とすれば79のデータにアクセスすることができる.それぞれのデー タは配列名と添字により,アクセスできる.これは,個々のデータに名前が付いているよ うなものである.コンピューターはなんの迷いも無く目的のメモリーアドレスが分かる. これはデータの順序通りにメモリーにすき間無く値が格納されているから,可能なのであ る.データへアクセスする場合の処理のオーダーはとなる.次の述べるリストより も格段に高速である.
リストの場合,目的のデータへのアクセスは手間がかかる.データのある場所が分かるの は先頭のデータのみである.これは後で述べる特別な方法で先頭のデータのみ分かるよう にしている.先頭のデータ63の次のデータ 27の次のデータ 82 の次のデータ 79--というように先頭からたぐりよせなくてはならない.こ のように先頭からたぐり寄せなくてはならないのは,それぞれのデータに名前が無いから である.したがって,個のデータがある場合,処理の平均的な回数はとなる. である.配列よりも処理の回数が増える.
配列は目的のデータにランダムアクセスが可能で,目的のデータの値を得たり,データの 値の変更が高速にできる.添え字を指定するだけで,それらが可能である.しかし,デー タの削除と挿入には計算回数が多くなる.たとえば,10番目のデータを削除するとなると, 11番目を10番目に移動,12番目を11番目に移動,13番目を12番目に移動とデータ を順次移動させる必要がある.
一方,リストは目的のデータにアクセスするためには,シーケンシャルアクセス 3を行う. そのため,データへのアクセス回数が多くなり配列より低速になる.しかし,データの削 除と挿入は簡単で,その前後へのノードのポインターの値を変更するだけである.したがっ て,挿入と削除は高速になる.
また,データの個数の柔軟性はリストの方が高い.配列の場合,要素の数はコンパイル時 に予め指定する必要がある.連続したメモリー領域を確保するためである.配列の場合, データ数が予め分からない場合は,十分大きなメモリー領域を確保することになる.その ため,メモリーを無駄遣いすることがある.それに対して,リストはデータの個数は後で 追加/削除できる.
これらの違いをまとめると,表2のようになる.一般的には,
データの追加/削除が多い場合にはリスト,データのアクセスが多い場合には配列を使う.