連想配列(れんそうはいれつ、)とは、コンピュータプログラミングにおいて、文字列や識別子などのキーを用いて対応する値を格納し参照するデータ構造である。抽象データ型の一種に位置づけられ、主に名前や項目によるデータ管理や検索のために利用される。多くの場合ハッシュ表や木構造によって実装され、要素の順序ではなくキーと値の対応関係を基準に操作する点を特徴とする。
連想リスト、連想コンテナ、辞書(あるいはカタカナでディクショナリ )、ハッシュ()、マップ()とも呼ばれる。
概要 プログラミングにおける単純な配列は、特定のアドレスからのオフセット(ずれ)をインデックスとして、アドレスとオフセットによって目的の値を得る。これに対し連想配列では、要素とそれを紐付けできるような値(キーと呼ぶ)のペアで表され、キーによって目的の値を求める。辞書やディクショナリという呼び方は、要素を本文、キーを見出しになぞらえたものと言える。ハッシュという呼び名はハッシュテーブルによって実装されることによる。
歴史 最初に の連想リストとして広く認知された。その後、 で table として、 で連想配列として実装したことで、その潜在能力がさらに広く知られるようになった。現在、Rubyなど一部の言語では、添え字にはどのようなデータでも使えるものもある。
データ構造 連想配列の実装に使われるデータ構造としては、主に平衡2分探索木(赤黒木やAVL木など)やハッシュテーブルがある。ほかにはB木や連想リスト、トライ木、基数木などが利用されることもある。純粋な連想配列においてはキーの重複があってはならない。マップ(連想配列)を拡張したマルチマップはキーが重複したデータも上書きせずに保持できるデータ構造である。
連想配列を一般化したデータ構造のひとつにマルチマップ()があり、一つのキーに対して複数の値を格納することができる, pp. 389–397.。また別の一般化である双方向マップ(、、)はバインディング操作を双方向で行う(キーと値に全単射関係をもたせる)データコンテナである。双方向マップの値それぞれが重複のないキーに関連付けられなければならない。キーを引数に取る通常の連想配列におけるlookup操作の他に値を引数にとるlookup操作が追加され、この操作は引数として与えられた値に関連付けられたキーを検索する。
よく用意される命令 純粋な連想配列でのキー–値間の参照を束縛(またはバインディングとも)と呼ぶ。「束縛」という語は新たな参照を作る過程に対しても用いられる。
しばしば定義される操作は以下のようなものが挙げられる:..
追加・挿入 新しいキー–値対を配列に追加し、キーと値の間への新たな参照を生成する。この操作(を行なう関数)の引数はキーとそれに紐付くべき値である。 再配置・置換 既存のキー–値対の値を書き換え、キーからの古い参照を新たな値への参照に再生成する。引数は元のキーと新たな値である。 除去・削除 キー–値対を配列から削除し、キーから値への参照を消去する。引数は配列から削除するキー。 検索・参照 キーに束縛されている値を取り出す。引数はキーであり、キー束縛された値が戻り値となる。紐付いた値が見付からない場合に例外を投げる実装もある。
また、連想配列はここで上げた以外の操作も含む。それは例えばキーの束縛数を特定したりすべてのキーを調べるための反復子を作成したりといったものである。この反復子によって得られる参照の順序はしばしば不定となる。
連想配列を標準で提供する主な言語 のような形式で宣言し,のように参照する実際にはアクションの内部などで行なう必要がある。。 のような形式で宣言し,のように参照する。 標準ライブラリのクラスstd::mapとして提供されている。これはハッシュではなく二分木により実装されている。ハッシュを用いた std::unordered_map も提供される。 D言語が、文字列をキーとして整数を値とする連想配列bの宣言である。 ()すべてのObjectが、文字列あるいはシンボルをキーとする連想配列として扱われる。MapとWeakMap型だとキーを任意のオブジェクトにすることができる。 Goが、文字列をキーとして整数を値とする連想配列の型定義である。 Interactive Data Language korn
標準パッケージの, , , , で提供。その他 などでも提供。 古典的にはキーとデータで構成された cons セルcar, cdrと呼ばれる二つデータが組になった、2-タプルのデータ構造のリスト、たとえば 、を連想配列として利用した(car部をキーにcdr部をデータ、またはその逆)。これを便利に扱うための関数(assoc, rassoc)が提供されている。Common Lispにおいてはハッシュ関数を利用した連想配列が提供されており、make-hash-table関数によってオブジェクトを生成でき、gethash関数ととsetfマクロの組み合わせによってキーと値のペアを操作できる。 表として宣言し,のように参照する。 (C#,VB.NET,F#) - System.Collections.Hashtable, System.Collections.Specialized.ListDictionary, System.Collections.Specialized.HybridDictionary, System.Collections.Generic.Dictionaryにて提供。(ただし Dictionary は CLR 2.0 以降) 結合配列 (Oracle Database 9i 以降) PHP - 配列と連想配列の区別がない 辞書として宣言し,のように参照する。 %ではじまる変数が連想配列だが、個別の要素にはで参照する。同言語で連想配列を(ハッシュ値を使うその実装方法にちなんで)「ハッシュ」と呼び始めたことから、「ハッシュ」が連想配列の別名として定着した。
組み込みのクラス Hash で提供
Scripting.Dictionaryで提供 Scripting.Dictionaryで提供
脚注 註釈
出典
関連項目 ルックアップテーブル メモ化