連想配列

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

連想配列(れんそうはいれつ、英語: associative array)とは、コンピュータプログラミングにおいて、添え字にスカラー数値以外のデータ型(文字列型等)も使用できる配列である。抽象データ型のひとつ。連想リスト連想コンテナ辞書(あるいはカタカナでディクショナリ 英語: dictionary)、ハッシュ英語: hash)、マップ英語: map)とも呼ばれる。

歴史的には、最初に LISP連想リストとして広く認知された。その後、SNOBOLtable として、AWK で連想配列として実装したことで、その潜在能力がさらに広く知られるようになった。現在、Ruby など一部の言語では、添え字にはどのようなデータでも使えるものもある。

データ構造[編集]

連想配列の実装に使われるデータ構造としては、主に平衡2分探索木赤黒木AVL木など)やハッシュテーブルがある。ほかにはB木連想リストトライ木基数木などが利用されることもある。純粋な連想配列においてはキーの重複があってはならない。マップ(連想配列)を拡張したマルチマップはキーが重複したデータも上書きせずに保持できるデータ構造である。

よく用意される命令[編集]

連想配列でキーと値の間での参照をバインディング(またはバインドとも)と呼ぶ。「バインディング」という語は新たな参照を作る過程に対しても用いられる。

しばしば定義される操作は以下のようなものが挙げられる:[1][2]

  • Add or insert(追加): 新しい(key, value)の対をコレクションに追加し、キーと値の間への新たな参照を追加する。この操作の引数はキーとそれに関連付けられる値である。
  • Reassign or replace(置換): 既存の(key, value)対の値を書き換え、キーからの古い参照を新たな値への参照に置き換える。引数はinsertを行った時のキーと新たな値である。
  • Remove or delete(削除): (key, value)対をコレクションから削除し、キーから値への参照を消去する。引数はコレクションから削除するキーのみ。
  • Lookup or get(検索): キーに束縛されている値を取り出す。引数はキーであり、キー束縛された値が戻り値となる。もし値が見つからなければ連想配列の実装の一部では例外をスローする。

また、連想配列はここで上げた以外の操作も含む。それは例えばキーの関連付けの数を特定したりすべてのキーを調べるためのイテレータを作成したりといったものである。このイテレータによって得られる参照の順序はしばしば不定となる。

マルチマップは一つのキーに対して複数の値を受け入れる点で連想配列を一般化する[3]双方向マップはバインディング操作を双方向で行う抽象データ型である。双方向マップの値それぞれが重複のないキーに関連付けられなければならない。キーを引数に取る通常の連想配列におけるlookup操作の他に値を引数にとるlookup操作が追加され、この操作は引数として与えられた値に関連付けられたキーを検索する。

連想配列を標準で提供する主な言語[編集]

  • AWK
  • C++ — 標準ライブラリのクラス std::map として提供されている。これはハッシュではなく二分木により実装されている。ハッシュを使いた std::unordered_map も提供される。
  • D言語
  • ECMAScript (JavaScript) - すべてのオブジェクトが、文字列が添え字の連想配列として扱われる
  • Icon
  • JavaJava Platform, Standard Edition標準パッケージのMap, HashMap, TreeMap, LinkedHashMap, Hashtable で提供。その他 Apache Commons Collections などでも提供。
  • LISP — キーとデータで構成された cons セル[4]のリストを連想配列として(car部をキーにcdr部をデータ、またはその逆)として使う関数(assoc, rassoc)が提供されている。
  • Lua
  • .NET Framework - System.Collections.Hashtable, System.Collections.Specialized.ListDictionary, System.Collections.Specialized.HybridDictionary, System.Collections.Generic.Dictionaryにて提供。(ただし Dictionary は CLR 2.0 以降)
  • PL/SQL — 結合配列 (Oracle Database 9i 以降)
  • PHP - 配列と連想配列の区別がない
  • Python — 「辞書型 (dictionary)」という名前で呼ばれる
  • Perl%ではじまる変数が連想配列。要素には$hash{$key}としてアクセスする(通常の配列は@で宣言し、要素へは$array[$index]としてアクセス)。同言語で連想配列を(その実装から)「ハッシュ」と呼び始めたことから、「ハッシュ」が連想配列の別名として定着した。
  • REXX
  • Ruby — 組み込みのクラス Hash で提供
  • Smalltalk
  • SNOBOL
  • Swift
  • Visual Basic
  • Visual Basic for Applications

脚注[編集]

  1. ^ Goodrich, Michael T.; Tamassia, Roberto (2006), “9.1 The Map Abstract Data Type”, Data Structures & Algorithms in Java (4th ed.), Wiley, pp. 368–371 .
  2. ^ Mehlhorn, Kurt; Sanders, Peter (2008), “4 Hash Tables and Associative Arrays”, Algorithms and Data Structures: The Basic Toolbox, Springer, pp. 81–98 .
  3. ^ Goodrich & Tamassia (2006), pp. 389–397.
  4. ^ car, cdrと呼ばれる二つデータが組になった、2-タプルのデータ構造

関連項目[編集]