Go語(yǔ)言題解LeetCode705設(shè)計(jì)哈希集合
題目描述
不使用任何內(nèi)建的哈希表庫(kù)設(shè)計(jì)一個(gè)哈希集合(HashSet)。
實(shí)現(xiàn) MyHashSet 類:
- void add(key) 向哈希集合中插入值 key 。
- bool contains(key) 返回哈希集合中是否存在這個(gè)值 key 。
- void remove(key) 將給定值 key 從哈希集合中刪除。如果哈希集合中沒有這個(gè)值,什么也不做。 示例:
輸入: ["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
思路分析
實(shí)現(xiàn)使用了鏈地址法,解決哈希沖突方法使用了模取余的方法(較簡(jiǎn)單的)。
這里說(shuō)下為什么大家說(shuō)模最好取質(zhì)數(shù),我的理解是取質(zhì)數(shù)可以讓取余后的結(jié)果更加均勻,以減少?zèng)_突。
舉個(gè)例子,假如我們?nèi)?為模,那么雖然理論上我們應(yīng)該會(huì)讓數(shù)字均勻落入4個(gè)桶中,但是對(duì)于下邊這個(gè)數(shù)組:
1,3,5,7,9
所有數(shù)字都落入了1,3兩個(gè)桶中,造成了極大的不均,導(dǎo)致哈希沖突發(fā)生頻繁。對(duì)于一個(gè)合數(shù),只要我們構(gòu)造合數(shù)倍數(shù)相關(guān)的數(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語(yǔ)言題解LeetCode705設(shè)計(jì)哈希集合的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言設(shè)計(jì)哈希集合的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)現(xiàn)
這篇文章主要為大家介紹了golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
golang切片擴(kuò)容規(guī)則實(shí)現(xiàn)
這篇文章主要介紹了golang切片擴(kuò)容規(guī)則實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Go語(yǔ)言實(shí)現(xiàn)的可讀性更高的并發(fā)神庫(kù)詳解
這篇文章主要為大家介紹了Go語(yǔ)言實(shí)現(xiàn)的可讀性更高的并發(fā)神庫(kù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
golang time包下定時(shí)器的實(shí)現(xiàn)方法
定時(shí)器的實(shí)現(xiàn)大家應(yīng)該都遇到過(guò),最近在學(xué)習(xí)golang,所以下面這篇文章主要給大家介紹了關(guān)于golang time包下定時(shí)器的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-12-12
深入string理解Golang是怎樣實(shí)現(xiàn)的
這篇文章主要為大家介紹了深入string理解Golang是怎樣實(shí)現(xiàn)的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
利用Go Plugin實(shí)現(xiàn)插件化編程的簡(jiǎn)單方法
Golang官方提供了plugin模塊,該模塊可以支持插件開,下面這篇文章主要給大家介紹了關(guān)于如何利用Go Plugin實(shí)現(xiàn)插件化編程的相關(guān)資料,需要的朋友可以參考下2021-10-10
go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法,實(shí)例分析了Go語(yǔ)言通過(guò)odbc連接、查詢與關(guān)閉access數(shù)據(jù)庫(kù)的技巧,需要的朋友可以參考下2015-03-03
golang API開發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架)
這篇文章主要介紹了golang API開發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

