Likou 705.ハッシュを実現するためのハッシュコレクションハッシュ(チェーンアドレス方式)ビット演算の設計

https://leetcode-cn.com/problems/design-hashset/
ここに画像の説明を挿入します
アイデア1:気取らない退屈なチェーンアドレス方式、ベクトル、転送_リストベクトル、転送\ _listv e c t o r f o r w a r d _ l i s t(後者は単一リンクリストです)。

class MyHashSet {
    
    
public:
    /** Initialize your data structure here. */
    const int num=2333;
    vector<forward_list<int>> hashTable;
    MyHashSet() {
    
    
        hashTable.resize(num);
    }
    
    void add(int key) {
    
    
        if(!contains(key))
            hashTable[key%num].push_front(key);
    }
    
    void remove(int key) {
    
    
        int idx=key%num;
        forward_list<int>::iterator it=hashTable[idx].before_begin();
        forward_list<int>::iterator nxt=hashTable[idx].begin();
        forward_list<int>::iterator ed=hashTable[idx].end();
        while(nxt!=ed&&*nxt!=key)
            it=nxt++;
        if(nxt!=ed)
            hashTable[idx].erase_after(it);
    }
    
    /** Returns true if this set contains the specified element */
    bool contains(int key) {
    
    
        int idx=key%num;
        forward_list<int>::iterator it=hashTable[idx].begin();
        forward_list<int>::iterator ed=hashTable[idx].end();
        while(it!=ed&&*it!=key)
            ++it;
        return it!=ed;
    }
};

/**
 * Your MyHashSet object will be instantiated and called as such:
 * MyHashSet* obj = new MyHashSet();
 * obj->add(key);
 * obj->remove(key);
 * bool param_3 = obj->contains(key);
 */

アイデア2:ビット演算はハッシュを実装します。このアイデアは非常に賢いです。unsigned long long unsigned \ long \ longの使用を検討してくださいu n s i g n e d l o n g l o n g  配列はハッシュを実現し、モジュラスをベースベースとして設定することもできますb a s e、次に任意のキーキーk e y、2つの部分に変換できます:⌊キー/ベース⌋\ lfloorキー/ベース\ rfloork個のE Y / B A S E キー%ベースキー\%ベースk e y b a s e、最初の部分は配列内の添え字を決定し、2番目の部分はその場所での値のバイナリ表現を決定します(コードはここでより直感的になるはずです)。ウルウルを考えるu l lタイプの値の範囲は、[0、2 64 − 1] [0,2 ^ {64} -1]です。[ 0 26 41 ]ull ullu l lタイプは最大64の値に対応するため、base = 64 base = 64b a s e=6 4、配列の範囲は⌊max_key /base⌋+ 1 \ lfloor max \ _key / base \ rfloor +1である必要がありますmはX _ k個のE Y / B A S Eを+1

class MyHashSet {
    
    
public:
    /** Initialize your data structure here. */
    const int base=64;
    vector<unsigned long long> hashTable;
    MyHashSet() {
    
    
        int max=1e6,num=max/base;
        if(num*base==max)
            ++num;
        hashTable.resize(num);
    }
    
    void add(int key) {
    
    
        hashTable[key/base]|=1ull<<(key%base);
    }
    
    void remove(int key) {
    
    
        hashTable[key/base]&=~(1ull<<(key%base));
    }
    
    /** Returns true if this set contains the specified element */
    bool contains(int key) {
    
    
        return hashTable[key/base]&(1ull<<(key%base));
    }
};

/**
 * Your MyHashSet object will be instantiated and called as such:
 * MyHashSet* obj = new MyHashSet();
 * obj->add(key);
 * obj->remove(key);
 * bool param_3 = obj->contains(key);
 */

おすすめ

転載: blog.csdn.net/xiji333/article/details/114718907