1. ホーム
  2. c

[解決済み] C - Setデータ構造を実装するには?

2022-03-15 14:55:14

質問

C言語でセットデータ構造(一意な値の集まり)を実装するトリッキーな方法はありますか?セット内の要素はすべて同じ型になり、巨大なRAMメモリがあります。

私が知っているように、整数の場合は、値のインデックスを持つ配列を使用することで、本当に速く簡単に行うことができます。しかし、私は非常に一般的なSetデータ型を持ちたいと考えています。そして、セットには自分自身を含めることができるといいんだけどね。

解決方法は?

あるのは を実装する複数の方法があります。 セット(およびマップ)機能などです。

  • ツリーベース・アプローチ(順序付きトラバーサル)
  • ハッシュベースのアプローチ (非順序トラバーサル)

以来 値のインデックスを持つ配列に言及しました。 であるハッシュベースのアプローチを試してみましょう。 値をインデックスにした配列の上に自然に構築されます。 .

にご注意ください。 メリット・デメリット ハッシュベースとツリーベースのアプローチの違い。

を設計することができます。 ハッシュセット (の特殊なケース)。 ハッシュテーブル へのポインタのことです。 ハッシュ化 POD を使用しています。 連鎖 のバケットの固定サイズ配列として内部的に表現される. ハッシャブル である。

  • すべて ハッシュ化可能 は同じハッシュ値を持っています。
  • として実装することができます。 動的配列 または ハッシャブルのリンクリスト
  • a ハッシュ化 's ハッシュ値は、バケットの配列へのインデックスとして使用されます。 (ハッシュ値でインデックスされた配列)
  • 一つ以上の ハッシュテーブル は、別のハッシュセットへの(ポインタの)可能性もあるし、ハッシュセットそのものへの(ポインタの)可能性もある(すなわち セルフインクルードが可能 )

大容量のメモリを自由に使うことができれば、バケットの配列のサイズを大きくすることができ、優れたハッシュメソッドと組み合わせることで、以下の確率を劇的に減らすことができます。 衝突 事実上、定時性を実現しています。

実装しなければならないでしょう。

  • その ハッシュ関数 ハッシュ化される型に対して
  • 2 つのハッシュが等しいかどうかを調べるために使われる、型に対する等値関数。
  • ハッシュセット contains / insert / remove の機能を持つ。

を使用することもできます。 オープンアドレス を、バケットを維持・管理するための代替手段として利用することができます。