-4

質問が投稿されたことは知っていますが、残念ながら私の問題への回答を関連付けることができなかったので、もう一度質問します...

私は線形ハッシュプロジェクトに取り組んでいます。私のコードは基本的に、動的に成長するハッシュ テーブルを作成する必要があります。要素は固定サイズ (配列) のバケットに格納され、テーブルにはさらにバケットがあります。すべてのバケットはオーバーフロー バケット (元のバケットに場所がなくなったときに作成される) を持つことができ、オーバーフローが作成されるたびに、いわゆる「分割」が実行され、テーブルにもう 1 つのバケットが追加され、テーブルが再ハッシュされます。詳細はありますが、これらの基本は私のコードを理解するのに十分だと思います..

だから私はデータ構造要素とバケットを持っており、バケットには要素を挿入し、それを見つけ、オーバーフローを作成するなど、いくつかの独自のメソッドがあります.私が使用しなければならない方法。全体がポインターで動作し、テストに使用するいくつかのテストファイルがあります。

今コードをテストすると、コンパイルされますが、ある時点で次のエラー メッセージが返されます:

template<typename InputIt> void insert(InputIt first, InputIt last) {                        
    for (auto it=first; it != last; ++it) {
        size_type idx = hashIndex(*it); 
        if(!(table[idx]->findElement(*it))) {
              insertElementInTable(*it);
        }
     }
}

コードのこの部分は、モジュロを使用するハッシュ関数で動作しますが、ハッシュ関数は次のとおりであるため、これがどのように浮動小数点例外を引き起こすかわかりません。

size_type hashIndex(const_reference key) const {
    size_type idx = hasher{}(key) % (2^roundNum); //roundNum is initialized with 1
    size_type d{roundNum};

    if(idx < nextToSplit) {
        ++d;
        idx = hasher{}(key) % (2^d);
    }

    return idx;
}

ここで見ることができる残りのコードhttps://pastebin.com/HXeUpaW5と最も重要な機能は次のとおりです。

--> findElement(const_reference key) - 51 ~ 69 行目

--> insertElementInTable(const_reference key) - createOverflow() 44-49、splitTable() 131-147、rehashAfterSplit() 153-176、および insertElementInBucket() 72-88 を呼び出す 179-197 行

問題が発生する理由がわからないため、新しい洞察を提供していただければ幸いです。ありがとう!

4

1 に答える 1