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キー/ベース\ rfloor⌊ k個の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 4−1 ]、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);
*/