[解決済み] C - Setデータ構造を実装するには?
2022-03-15 14:55:14
質問
C言語でセットデータ構造(一意な値の集まり)を実装するトリッキーな方法はありますか?セット内の要素はすべて同じ型になり、巨大なRAMメモリがあります。
私が知っているように、整数の場合は、値のインデックスを持つ配列を使用することで、本当に速く簡単に行うことができます。しかし、私は非常に一般的なSetデータ型を持ちたいと考えています。そして、セットには自分自身を含めることができるといいんだけどね。
解決方法は?
あるのは を実装する複数の方法があります。 セット(およびマップ)機能などです。
- ツリーベース・アプローチ(順序付きトラバーサル)
- ハッシュベースのアプローチ (非順序トラバーサル)
以来 値のインデックスを持つ配列に言及しました。 であるハッシュベースのアプローチを試してみましょう。 値をインデックスにした配列の上に自然に構築されます。 .
にご注意ください。 メリット・デメリット ハッシュベースとツリーベースのアプローチの違い。
を設計することができます。 ハッシュセット (の特殊なケース)。 ハッシュテーブル へのポインタのことです。 ハッシュ化 POD を使用しています。 連鎖 のバケットの固定サイズ配列として内部的に表現される. ハッシャブル である。
- すべて ハッシュ化可能 は同じハッシュ値を持っています。
- として実装することができます。 動的配列 または ハッシャブルのリンクリスト
- a ハッシュ化 's ハッシュ値は、バケットの配列へのインデックスとして使用されます。 (ハッシュ値でインデックスされた配列)
- 一つ以上の ハッシュテーブル は、別のハッシュセットへの(ポインタの)可能性もあるし、ハッシュセットそのものへの(ポインタの)可能性もある(すなわち セルフインクルードが可能 )
大容量のメモリを自由に使うことができれば、バケットの配列のサイズを大きくすることができ、優れたハッシュメソッドと組み合わせることで、以下の確率を劇的に減らすことができます。 衝突 事実上、定時性を実現しています。
実装しなければならないでしょう。
- その ハッシュ関数 ハッシュ化される型に対して
- 2 つのハッシュが等しいかどうかを調べるために使われる、型に対する等値関数。
-
ハッシュセット
contains
/insert
/remove
の機能を持つ。
を使用することもできます。 オープンアドレス を、バケットを維持・管理するための代替手段として利用することができます。
関連
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 山積みされた靴下を効率よく組み合わせるには?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] NaN値をチェックするにはどうすればよいですか?
-
[解決済み] 簡単な面接問題が難しくなった:1~100の数字が与えられたとき、ちょうどk個の数字が欠けていることを見つけなさい。
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] JavaScriptでStackとQueueを実装するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決済み] g++ コンパイルエラー: ')'トークンの前に一次式があることが予想される
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] ⑭と⑯は何のためにあるのですか?
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] C言語の構造体(CGRectやCGPointなど)をNSLog化することは可能ですか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?