ハッシュテーブルを使おう

ハッシュメニュー【オープンアドレス法・チェイン法・ハッシュテーブルを使おう】

【オープンアドレス法】コード

reader.on('close', () => {
   const H = new Array(10).fill(-1);  // 要素数 10 の配列,初期値は全て -1
   const N = Number(lines[0]);
   for (let i = 1; i <= N; i++) {
      const x = Number(lines[i]);  // 格納するデータ
    // console.log(x);
      let h = x;  // hx で初期化 
      while (H[h % 10] !== -1) {  // H[h % 10] が -1 でない間
         h++;  // hh + 1 で上書き
      }
      h %= 10;  // hh mod 10 で上書き
      H[h] = x;  // H[h] に x を保存
   }
   H.forEach(h => {
      console.log(h);  // H の各値を出力
   });
});
hogeちゃんの画像

while文 で 値 (添字) の計算を行っています。

【チェイン法】コード

reader.on('close', () => {
   const H = [];
   for (let i = 0; i < 10; i++) {
      H.push([]);  // H に 空の配列を 10個 保存→二次元配列
   }
   const N = Number(lines[0]);
   for (let i = 1; i <= N; i++) {
      const x = Number(lines[i]);  // 格納するデータ
      // console.log(x);
      const h = x % 10;  // h = x のハッシュ値
      H[h].push(x);  // H[h] に x を保存
   }
   H.forEach(h => {
      console.log(...h);
   });
});
hogeちゃんの画像

ハッシュ値が重複した場合は 同じ場所に複数のデータを保存。

【ハッシュテーブルを使おう】コード

reader.on('close', () => {
   const H = [];
   for (let i = 0; i < 100; i++) {
      H.push([]);
   }
   const [a, b] = lines[0].split(' ').map(Number);
   const q = Number(lines[1]);
   for (let i = 2; i < q + 2; i++) {
      const [Q, x] = lines[i].split(' ').map(Number);  // x = 格納するデータ
      const h =  (a * x + b) % 100;  // h = ハッシュ値
      switch (Q) {  // Q が…
      case 1:  // 1 なら…
         H[h].push(x);  // H[h]. に x を保存
         break;
      case 2:  // 2 なら…
         console.log(H[h].includes(x) ? 'Yes' : 'No');  // H[h] に x が含まれるかどうか判定
         break;
      }
   }
   H.forEach(h => {
      console.log(...h);
   });
});
hogeちゃんの画像

青字の部分をconst H =new Array(100).fill([]);に書き換えると なぜか エラーになりました 何故??(´·ω·`)。

コメント