Go語言題解LeetCode705設計哈希集合
題目描述
不使用任何內(nèi)建的哈希表庫設計一個哈希集合(HashSet)。
實現(xiàn) MyHashSet 類:
- void add(key) 向哈希集合中插入值 key 。
- bool contains(key) 返回哈希集合中是否存在這個值 key 。
- void remove(key) 將給定值 key 從哈希集合中刪除。如果哈希集合中沒有這個值,什么也不做。 示例:
輸入: ["MyHashSet", "add", "add", "contains", "contains", "add", "contains", "remove", "contains"] [[], [1], [2], [1], [3], [2], [2], [2], [2]] 輸出: [null, null, null, true, false, null, true, null, false] 解釋: MyHashSet myHashSet = new MyHashSet(); myHashSet.add(1); // set = [1] myHashSet.add(2); // set = [1, 2] myHashSet.contains(1); // 返回 True myHashSet.contains(3); // 返回 False ,(未找到) myHashSet.add(2); // set = [1, 2] myHashSet.contains(2); // 返回 True myHashSet.remove(2); // set = [1] myHashSet.contains(2); // 返回 False ,(已移除)
提示:
- 0 <= key <= 10^6
- 最多調(diào)用 10^4 次 add、remove 和 contains
思路分析
實現(xiàn)使用了鏈地址法,解決哈希沖突方法使用了模取余的方法(較簡單的)。
這里說下為什么大家說模最好取質(zhì)數(shù),我的理解是取質(zhì)數(shù)可以讓取余后的結果更加均勻,以減少沖突。
舉個例子,假如我們?nèi)?為模,那么雖然理論上我們應該會讓數(shù)字均勻落入4個桶中,但是對于下邊這個數(shù)組:
1,3,5,7,9
所有數(shù)字都落入了1,3兩個桶中,造成了極大的不均,導致哈希沖突發(fā)生頻繁。對于一個合數(shù),只要我們構造合數(shù)倍數(shù)相關的數(shù)組,就很容易使哈希沖突變多,所以盡量選用質(zhì)數(shù)。
AC 代碼
struct Listnode{
int val;
Listnode* next = nullptr;
Listnode()=default;
Listnode(int val){
this->val = val;
}
};
class MyHashSet {
public:
/** Initialize your data structure here. */
const int prime = 991;
vector<Listnode*> nodes;
MyHashSet(): nodes(prime, nullptr){
}
void add(int key) {
if(nodes[key%prime] == nullptr){
nodes[key%prime] = new Listnode(key);
}else{
Listnode* node = nodes[key%prime];
while(node != nullptr){
if(node->val == key)return;
node = node->next;
}
node = new Listnode(key);
node->next = nodes[key%prime];
nodes[key%prime] = node;
}
}
void remove(int key) {
Listnode* prenode = nodes[key%prime];
if(prenode != nullptr && prenode->val == key){
if(prenode->next != nullptr){
nodes[key%prime] = prenode->next;
delete prenode;
}else{
delete prenode;
nodes[key%prime] = nullptr;
}
return;
}
while(prenode != nullptr && prenode->next != nullptr){
if(prenode->next->val == key){
Listnode* temp = prenode->next;
prenode->next = prenode->next->next;
delete temp;
return;
}
prenode = prenode->next;
}
}
/** Returns true if this set contains the specif ied element */
bool contains(int key) {
Listnode* node = nodes[key%prime];
while(node != nullptr){
if(node->val == key)return true;
node = node->next;
}
return false;
}
};
/**
* 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);
*/以上就是Go語言題解LeetCode705設計哈希集合的詳細內(nèi)容,更多關于Go語言設計哈希集合的資料請關注腳本之家其它相關文章!
相關文章
go語言通過odbc操作Access數(shù)據(jù)庫的方法
這篇文章主要介紹了go語言通過odbc操作Access數(shù)據(jù)庫的方法,實例分析了Go語言通過odbc連接、查詢與關閉access數(shù)據(jù)庫的技巧,需要的朋友可以參考下2015-03-03
golang API開發(fā)過程的中的自動重啟方式(基于gin框架)
這篇文章主要介紹了golang API開發(fā)過程的中的自動重啟方式(基于gin框架),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12

