セット (抽象データ型)

セット（）あるいは集合とは、コンピュータプログラミングで用いられる抽象データ型の一種。順序のないデータの集まりを表現する抽象データ型であり、同一のデータは一つしか含まれないことが保証される。

重複したデータの挿入 
データの同一性は与えられた比較関数で判定されるので、外の文脈で同一かどうかは関数依存である。例えば文字列"hoge"と"HOGE"は異なるデータと見ることもできるし、大文字・小文字を区別せずに比較すれば（常に大文字化あるいは小文字化したもの同士を比較すれば）同一のデータと見ることもできるといった具合である。

そのような重複するデータを挿入しようとした場合はこれを処理する必要がある。
 無視する
 新しい物で置き換える
 多重化する（→マルチセット参照）
狭義のセットにおいては重複データは無視されるか新しいデータで置き換えるかされる。もしここで多重化することを選択した場合は複数回の削除を行わなければ値は完全に取り除かれない。

アクセス速度は実装により様々だが、二分木（TreeSet）やハッシュテーブル（HashSet）などのデータ構造を用いて高速化を図ることが多い。

その他の抽象データ型との違い 
 リストはそれぞれのデータに順序が定義される点が異なる。
 配列は順序が定義されるほか、静的配列ではさらに格納可能な要素数が変更できない。
 マルチセットは同じデータを複数格納できるが、狭義のセットでは重複したデータは無視される。マルチセットはbagとも呼ばれる。

各プログラミング言語におけるセット 
 C++ - 標準テンプレートライブラリにstd::setおよび要素の重複を許容するstd::multisetが定義されている。C++11では、これらに加えてstd::unordered_setおよびstd::unordered_multisetが追加された。
 Java - インタフェースを実装するやなど
 .NET Framework - System.Collections.Generic.ISet (.NET 4以降) を実装するSystem.Collections.Generic.SortedSet (.NET 4以降) やSystem.Collections.Generic.HashSet (.NET 3.5 SP1以降) など
 Python - ミュータブルなset型と、イミュータブルなfrozenset型がある。
 Ruby - 標準添付のsetライブラリにSetクラスと、ソートされた順番で取り出されるSortedSetクラスがある。

参照

関連項目 
 集合
 素集合データ構造

抽象データ型