Hash table


Hash Table


ハッシュ関数でKeyをハッシュし、得られた結果値をハッシュリストのインデックスとして使用してデータを格納します.保存されている場所は普通に並んでいます!

ハッシュ関数


関数
  • は、任意の長さのデータを固定長のデータにマッピングする
  • ハッシュ関数出力の結果をハッシュ値
  • と呼ぶ

    ハッシュ関数の原理

  • ハッシュ・テーブルの長さで除算された残りの値がハッシュとして使用されるため、ハッシュ・テーブルの長さの範囲内でハッシュ値が導出される.
  • function _hash(key) {
    	return key % myHashTableSize;
    }

    ハッシュ競合

  • は異なるキー値を追加するが、同じハッシュ値を解放すると発生する競合
  • である.
    _hash(1000) // 2
    _hash(500) // 2
  • 同じインデックス位置は、異なる値
  • を含む.

    ハッシュ競合の解決

  • ハッシュ競合の2つの解決策は、オープンアドレス、分離梱包
  • である.
  • オープンアドレス法
  • この方法は、同じデータをインデックスに格納するのではなく、ハッシュ関数によって得られたハッシュ値(index)に格納することである.
  • 他のインデックスを検索する方法はいくつかあります.
  • 分離梱包(分離接続)
  • ハッシュ・テーブルbucketにデータを格納するのではなく、リンク・リストまたはツリーを使用します.
  • set(key, value) {
      let index = this._hash(key);
      if (!this.dataMap[index]) {
      	this.dataMap[index] = [];
      }
      this.dataMap[index].push([key, value]);
    }

    インプリメンテーション

    class HashTable {
      constructor(size = 7) {
        this.dataMap = new Array(size);
      }
    
      _hash(key) {
        let hash = 0;
        for (let i = 0; i < key.length; i++) {
          hash = (hash + key.charCodeAt(i) * 23) % this.dataMap.length;
        }
        return hash;
      }
    
      set(key, value) {
        let index = this._hash(key);
        if (!this.dataMap[index]) {
          this.dataMap[index] = [];
        }
        this.dataMap.push([key, value]);
        return this;
      }
    
      get(key) {
        let index = this._hash(key);
        if (this.dataMap[index]) {
          for (let i = 0; i < this.dataMap[index].length; i++) {
            if (this.dataMap[index][i][0] === key) {
              return this.dataMap[index][i][1];
            }
          }
        }
        return undefined;
      }
    
      keys() {
        let allKeys = [];
        for (let i = 0; i < this.dataMap.length; i++) {
          if (this.dataMap[i]) {
            for (let j = 0; j < this.dataMap[i].length; j++) {
              allKeys.push(this.dataMap[i][j][0]);
            }
          }
        }
        return allKeys;
      }
    }