JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでハッシュテーブルに要素を追加する方法(チェイン法による衝突解決)

ハッシュテーブルへ要素を追加する際に最も重要なのが「衝突(コリジョン)」の解決です。本記事では、チェイン法(Chaining/連鎖法)と呼ばれる手法を使って衝突を処理する方法を解説します。

チェイン法以外にも、オープンアドレス法などさまざまな衝突解決アルゴリズムが存在します。興味のある方は Wikipedia の Hash table ページを参考にしてください。

ハッシュテーブルへの要素追加の実装

ここでは説明をシンプルにするため、整数のみを対象とするハッシュ関数を作成します。より複雑なハッシュアルゴリズムを採用すれば、任意のオブジェクトをキーとしてハッシュ化することも可能です。

以下は、キーと値のペアをハッシュテーブルに登録する put メソッドの実装例です。

put メソッドのコード例

put(key, value) {
    let hashCode = hash(key);

    for(let i = 0; i < this.container[hashCode].length; i ++) {

        // 同じキーがすでに存在する場合は
        // 既存の値を新しい値で上書きする
        if(this.container[hashCode][i].key === key) {
            this.container[hashCode][i].value = value; return;
        }
    }

    // キーと値のペアを配列の末尾に追加する
    this.container[hashCode].push(new this.KVPair(key, value));
}

コードのポイント

  • ハッシュ値の計算:hash 関数を使ってキーから格納先のインデックス(バケット位置)を求めます。
  • 既存キーのチェック:同じバケット内に同一のキーが存在する場合は、値だけを更新して処理を終了します。
  • 新規ペアの追加:同じキーが存在しない場合は、KVPair オブジェクトをそのバケットの配列末尾に push します。

動作確認

実際にこのメソッドを使って、複数のデータをハッシュテーブルに追加してみましょう。

let ht = new HashTable();
ht.put(10, 94); ht.put(20, 72);
ht.put(30, 1);
ht.put(21, 6);
ht.put(15, 21);
ht.put(32, 34);
ht.display();

出力結果

このコードを実行すると、次のような出力が得られます。

0:
1:
2:
3:
4: { 15: 21 }
5:
6:
7:
8: { 30: 1 }
9: { 20: 72 }
10: { 10: 94 } -->{ 21: 6 } -->{ 32: 34 }

出力を見ると、キー 102132 がすべて同じバケット(インデックス10)にマッピングされていることがわかります。このように、異なるキーが同じバケットに割り当てられる現象が「衝突」です。チェイン法では、連結リストのように要素をつなげて保存することで、この衝突を効率的に解決しています。

  1. JavaScriptのハッシュテーブル:データ構造の基礎と実装方法を徹底解説

    ハッシュテーブル(Hash Table)は、データを連想形式で格納するデータ構造です。ハッシュテーブルでは、データは配列形式で保持され、それぞれのデータ値に固有のインデックス値が割り当てられます。目的のデータのインデックスさえ分かれば、データへのアクセスは非常に高速に行えます。そのため、ハッシュテーブルはデータサイズの大小にかかわらず、挿入操作も検索操作も非常に高速に実行できるデータ構造となっています。ハッシュテーブルは配列を記憶領域として利用し、要素を挿入または検索すべきインデックスを生成するために「ハッシュ」という技法を用います。ハッシュ化(Hashing)とはハッシュ化とは、キー値の範囲

  2. JavaScriptのimportで波括弧「{}」を使う理由とは?名前付きエクスポートの基本をわかりやすく解説

    JavaScript(ESモジュール)でモジュールを読み込む際、import 文に波括弧 { } を付けるかどうか迷ったことはありませんか?実はこの波括弧は、名前付きエクスポート(named export)を読み込むために必要な記法です。本記事では、実際のコード例を使いながら、{ } の役割と使い方を詳しく解説します。 importで { } を使う場面とは JavaScriptのESモジュールでは、エクスポート方法によって読み込み側の書き方が変わります。 名前付きエクスポート:export { 関数名 } のようにエクスポートされたものを読み込む場合は、import { 名前 } fro