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

C++で学ぶチェイン法(連鎖法)によるハッシュテーブルの実装

ハッシュ化とは、任意の長さのデータ要素を固定サイズのキーへマッピングする手法のことです。ハッシュは「キーと値のペア」として動作します。

ハッシュ関数は、ハッシュマップ内でマッピングを担う関数です。ハッシュ関数に入力された複数のデータ要素が、同じハッシュキーを持つことがあります。この場合、要素同士が衝突(オーバーラップ)してしまいます。同じハッシュキーを持つ要素の衝突を回避するために考案されたのが「チェイン法(連鎖法)」という概念です。

ハッシュマップの作成

ハッシュマップを作成するには、データ要素のインデックス値を決定するハッシュ関数が必要です。

ここでは、n個のバケットを持つハッシュテーブルを用意します。ハッシュテーブルにノードを挿入する際は、次のハッシュ関数を使用します。

hashIndex = key % バケット数

このハッシュ関数を用いて、ハッシュマップに挿入するすべての値のハッシュインデックスを計算します。

  • 要素の挿入:キー値からハッシュインデックスを計算し、そのリストの末尾に新しいノードを追加します。

  • ノードの削除:ハッシュインデックスを計算し、対応するバケット内を検索して該当要素を見つけ、削除します。

サンプルコード

#include<iostream>
#include <list>
using namespace std;
class Hash{
    int BUCKET;
    list < int >*table;
    public:
    Hash (int V);
    void insertItem (int x);
    void deleteItem (int key);
    int hashFunction (int x){
        return (x % BUCKET);
    }
    void displayHash ();
};
Hash::Hash (int b){
    this->BUCKET = b;
    table = new list < int >[BUCKET];
}
void Hash::insertItem (int key){
    int index = hashFunction (key);
    table[index].push_back (key);
}
void Hash::deleteItem (int key){
    int index = hashFunction (key);
    list < int >::iterator i;
    for (i = table[index].begin (); i != table[index].end (); i++){
    if (*i == key)
        break;
    }
    if (i != table[index].end ())
        table[index].erase (i);
}
void Hash::displayHash (){
    for (int i = 0; i < BUCKET; i++){
        cout << i;
        for (auto x:table[i])
        cout << " --> " << x;
        cout << endl;
    }
}
 int main (){
    int a[] = { 5, 12, 67, 9, 16 };
    int n = 5;
    Hash h (7);
    for (int i = 0; i < n; i++)
    h.insertItem (a[i]);
    h.deleteItem (12);
    h.displayHash ();
    return 0;
}

実行結果

0
1
2 --> 9 --> 16
3
4 --> 67
5 --> 5
6

このプログラムでは、7個のバケットを持つハッシュテーブルを作成し、値 {5, 12, 67, 9, 16} を挿入した後、キー「12」を削除しています。同じインデックスに割り当てられた要素(例:9 と 16)は、連結リストで連鎖的に管理されていることが出力から確認できます。


  1. 配列の全要素を乗算するC++プログラムの解説

    整数型の要素を持つ配列が与えられたとき、配列内のすべての要素を掛け合わせ、その積を表示することを考えます。本記事では、この問題をC++(C言語スタイルのコード)で解く方法を、アプローチ、アルゴリズム、サンプルコード、実行結果まで順を追って解説します。 例 入力: arr[]={1,2,3,4,5,6,7} 出力: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 入力: arr[]={3, 4, 6, 2, 7, 8, 4} 出力: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 解き方のアプローチ この問題は、累積用の一時変数を用意し、配列の要素を先頭

  2. C++で8進数を10進数に変換するプログラムの書き方

    8進数が入力として与えられたとき、それを10進数に変換するのが本記事のテーマです。 コンピュータ上の10進数は基数10で表現されます。一方、8進数は基数8で表現され、使用できる数字は0〜7に限られます。これに対して10進数では、0〜9までの任意の数字を使用することができます。 8進数から10進数への変換手順 右から左へ向かって剰余演算により各桁を取り出し、0から始まるべき乗を掛けます。指数は「桁数 − 1」に達するまで1ずつ増加させます。 8進数を変換するため、べき乗の基数は8となります(8進数の基数が8であるため)。 入力された数値の各桁に基数とべき乗を掛け、その結果を記録します。 すべて