ハッシュマップを実行する方法


メモリ内のすべての要素が連続しているので、配列は特定のインデックスで要素を検索するのに驚くべきものですO(1) または一定の時間ルックアップ.しかし、しばしばインデックスを経由してルックアップを行うことはできません.ハッシュマップとハッシュテーブルは、このあたりの方法ですkeys 代わりに.
を実装できますかMap クラスから傷?つのメソッドだけが必要です.get and set . 多くのプログラミング言語には、組み込みのハッシュまたは辞書プリミティブがありますJavascript Object{} しかし、私たちはこのエクササイズのためにそれを使いたくありません.
このレッスンは、もともと2007年に出版されましたhttps://algodaily.com , 私は技術的なインタビューコースを維持し、野心的な開発者のために考える作品を書く.

注意:レギュラーJavascript オブジェクトとMap クラスは単純なキー値ハッシュテーブル/連想配列です.
エーMap オブジェクトは挿入順序で要素を反復処理できますが、JavaScriptObject sは注文を保証しません.加えてObject sはプロトタイプのためにデフォルトキーを持ちます、そしてMap sはデフォルトキーで来ません.Here's a good breakdown 二つのうち.この運動の目的のために、両方のために同じ機能性を仮定しましょう.
以下の2つのメソッドを定義します.
  • get(key: string) キーを与え、そのキーの値を返します.
  • set(key: string, val: string) パラメータとしてキーと値を取り、ペアを格納します.
  • また、以下のハッシュ関数を提供しましたhashStr . それは衝突を避けることを試みるが、完全ではない.それは文字列値をとり、整数を返します.
    function hashStr(str) {
        let finalHash = 0;
        for (let i = 0; i < str.length; i++) {
            const charCode = str.charCodeAt(i);
            finalHash += charCode;
        }
        return finalHash;
    }
    
    console.log(hashStr('testKey'))
    
    新しいクラスを呼びましょうHashmap クラスを使用します.
    const m = new Hashmap();
    m.set('name', 'Jake');
    console.log(m.get('name'));
    
    一般的なハッシュ表がどのように働くかを見直すことから始めましょうHashmap data structure に基づいています.我々が指摘したように、多くのプログラミング言語ではHashmap 遺産に基づくクラスHashtable . このコードの我々の提案された実装を踏みましょう.

    それで、ハッシュテーブルがデータをバケツに格納することによって働くということを知っています.これらのバケツにアクセスするには、Aを変換する方法が必要ですkey バケット番号に.(バケットは、配列とツリーの両方を使ってモデル化することができますが、物事を単純にして速度を最大化するためには、配列を使うことに固執します).
    キーを使用すると、データが配列のどこにあるかを知る必要がなくなります.我々data structure したがって、この場合にはハッシュ関数が必要ですhashStr , 計算するindex into buckets 必要な値が格納されている場合.我々は本質的にマッピングkey を介して配列インデックスにhashStr ハッシュ関数.
    hashStr('r')
    // 114
    
    // array = [  _  ,  X  ,  _  ,  _ ]
    // index     113   114   115   116
    
    ご覧の通り、すべてhashStr は、key 提供set() , そして、私たちのための場所を計算します.我々は、したがって、もう一つを必要としますdata structure 値が置かれる実際の保管とバケツのために.もちろん、あなたはすでにそれが配列であることを知っている!

    フィルイン


    ハッシュテーブルのスロットやバケツは、通常、Count Kin - Chi - Chi - Chi - Chinnoとそのインデックスに格納される.
    解決方法:配列
    クラスを書くのは良いことです.
    class Hashmap {
      constructor() {
        this._storage = [];
      }
    }
    
    返り値はhashStr 入力した値がどこにあるかを決めるthis._storage .
    衝突に関する言葉collisions ハッシュ関数が1つ以上のキーに対して同じインデックスを返す場合、この質問の範囲外です.しかし、追加のデータ構造を使用してそのような問題を処理する方法があります.

    複数選択


    ハッシュテーブル実装での衝突の解決方法は次のどれですか?
  • 衝突の良い解決策はない.ハッシュ関数はユニークでなければならない
  • 配列のインデックスが値のチェーンで構成されるリンクリストで、しばしば連鎖します
  • インデックスごとに値を格納するトライを使用します
  • すべての値をそのバケツで1つの文字列として連結する
  • 配列のインデックスが値のチェーンから成るリンクリストでしばしば別々の連鎖を使用してください
    この時点で、私たちは私たちのビルディングブロックを持っていますset メソッド.次のようになります.
  • を取るkey 通過
  • ハッシュ関数を通して実行し、
  • 値を設定するstorage その特定のインデックスで
  • 我々が同様にそれを保存している方法に注意してくださいthis._storage ( this._storage[idx] ) それ自体が配列であり、それによって衝突問題に対して原始的に解決される.
    set(key, val) {
      let idx = this.hashStr(key);
    
      if (!this._storage[idx]) {
        this._storage[idx] = [];
      }
    
      this._storage[idx].push([key, val]);
    }
    
    The set 今すぐ方法はかなり簡単ですが、右?
    それは私たちと同じコンセプトですget メソッド.私たちがそこでやっていることはkey 通してhashStr 設定の代わりに、結果のインデックスに移動し、値を取得します.
      for (let keyVal of this._storage[idx]) {
        if (keyVal[0] === key) {
          return keyVal[1];
        }
      }
    
    注意しなければならないのは、存在しないキーを渡すことが可能であることですset ), それで、我々は戻ることによってそれを扱うべきですundefined もしそうならば.
    get(key) {
      let idx = this.hashStr(key);
    
      if (!this._storage[idx]) {
        return undefined;
      }
    
      for (let keyVal of this._storage[idx]) {
        if (keyVal[0] === key) {
          return keyVal[1];
        }
      }
    }
    
    それは、それをするべきです!それを試してみましょう.
    class Hashmap {
      constructor() {
        this._storage = [];
      }
    
      hashStr(str) {
        let finalHash = 0;
        for (let i = 0; i < str.length; i++) {
          const charCode = str.charCodeAt(i);
          finalHash += charCode;
        }
        return finalHash;
      }
    
      set(key, val) {
        let idx = this.hashStr(key);
    
        if (!this._storage[idx]) {
          this._storage[idx] = [];
        }
    
        this._storage[idx].push([key, val]);
      }
    
      get(key) {
        let idx = this.hashStr(key);
    
        if (!this._storage[idx]) {
          return undefined;
        }
    
        for (let keyVal of this._storage[idx]) {
          if (keyVal[0] === key) {
            return keyVal[1];
          }
        }
      }
    }
    
    
    
    このレッスンは、もともと2007年に出版されましたhttps://algodaily.com , 私は技術的なインタビューコースを維持し、野心的な開発者のために考える作品を書く.