目次

キーワード

セット

数学などにおいては、 「集合(set)」というと、 要素を包含するかどうかだけが問題で、 挿入された順序等は意味を持ちません。

ということで、要素の順序は関係ないという状況下で、 要素の挿入・削除・検索を高速で行えるようなコレクションをセット(set)と呼びましょう。 (「集合」だとコレクションと紛らわしいので、英語のままにしておきます。 ちなみに、数学用語的には、collection は「集まり」と訳します。)

ソート済み配列」、 「ハッシュテーブル」、 「2分探索木」等は全てこの要件を満たしています。 要するに、これらはいずれもセットと呼ぶに値する機能を持っています。 そこで、セットは、以下のような「インターフェース」として定義します。

/// <summary>
/// セット。
/// 数学で「集合」と呼ぶ奴。
/// 要素の順序には意味がなくて、要素が含まれているかどうかだけが問題。
/// </summary>
/// <typeparam name="T">要素の型</typeparam>
interface ISet<T> : IEnumerable<T>
{
  /// <summary>
  /// 新しい要素の挿入。
  /// </summary>
  /// <param name="elem">新しい要素</param>
  void Insert(T elem);

  /// <summary>
  /// 要素の削除。
  /// </summary>
  /// <param name="elem">削除したい要素</param>
  void Erase(T elem);

  /// <summary>
  /// 要素を含むかどうか。
  /// </summary>
  /// <param name="elem">検索したい要素</param>
  /// <returns>見つかった場合 true</returns>
  bool Contains(T elem);
}

ソート済み配列」、 「ハッシュテーブル」、 「2分探索木」は、 この ISet インターフェースを実装します。

サンプルソース

C# サンプルソースを示します。

https://github.com/ufcpp/UfcppSample/blob/master/Chapters/Algorithm/Collections/Set.cs

更新履歴

ブログ