不使用任何內建的雜湊表庫設計乙個雜湊對映
具體地說,你的設計應該包含以下的功能
put(key, value):向雜湊對映中插入(鍵,值)的數值對。如果鍵對應的值已經存在,更新這個值。
get(key):返回給定的鍵所對應的值,如果對映中不包含這個鍵,返回-1。
remove(key):如果對映中存在這個鍵,刪除這個數值對。
示例:myhashmap hashmap = new myhashmap();
hashmap.put(1, 1);
hashmap.put(2, 2);
hashmap.get(1); // 返回 1
hashmap.get(3); // 返回 -1 (未找到)
hashmap.put(2, 1); // 更新已有的值
hashmap.get(2); // 返回 1
hashmap.remove(2); // 刪除鍵為2的資料
hashmap.get(2); // 返回 -1 (未找到)
注意:所有的值都在 [0, 1000000]的範圍內。
操作的總數目在[1, 10000]範圍內。
不要使用內建的雜湊庫。
1、暴力求解法
#include
#include
#include
using
namespace std;
class
hashmap1
void
put(
int key,
int value)
intget
(int key)
return-1
;}void
remove
(int key)
private
:static
const
int n =
1000001
; vector<
int> data;};
intmain()
分析一下:暴力求解法,我們的雜湊函式就是陣列儲存位置下標=key,為了儲存100000以內的key,我們建立了乙個1000000長度的int陣列,int資料範圍足夠存100000以內的數字。
符合題目要求。空間複雜度就是1000000,陣列長度。時間複雜度就是o(1)
提交之後,發現空間消耗203mb,時間消耗193毫秒。
顯然這是不夠的,我們需要更加高效的解法。
2.二維陣列,稀疏陣列節省空間
先看**:
#include
#include
#include
#include
using
namespace std;
class
hashmap1
}auto
gethashkey1
(int key)
auto
gethashkey2
(int key)
void
put(
int key,
int value)
intget
(int key)
return-1
;}void
remove
(int key)
private
:static
const
int n =
1001
;int data[n]
[n];};
intmain()
我們使用10011001的二維陣列儲存,注意的一點是,
如果我們用hashmap1 hash來建立乙個新物件,會出現警告,因為這個是從棧中分配空間,深度是有限的適用於存放簡單的臨時變數,一旦儲存空間過長,就會出現溢位。
我們可以用hashmap1 hash=new hashmap1();new乙個物件,這是從堆中分配空間的,重要的是我們要手動釋放空間delete(hash),並且呼叫函式時要用指標引用->.
不過好像並沒有節省空間,和我的預期有差距,在leetcode沒有通過,應該是空間太大。想了一下,一開始就定義了1001*1001並且初始化了,而且判斷位置時更複雜了,應該在put時才把那一行初始化為1,這樣的話,有很多行就不用初始化,節省空間。
class
myhashmap);
}int
find
(int key)
return k;
}void
put(
int key,
int value);}
intget
(int key)
return hashtable[k]
.second;
}void
remove
(int key)
}private
:const
static
int n =
20011
; vectorint,
int>> hashtable;
};
4、拉鍊法
#include
#include
#include
#include
using
namespace std;
struct mylistnode
mylistnode
(int _key,
int _val)
:key
(_key)
,val
(_val)
,next
(nullptr)}
;class
myhashmap
void
put(
int key,
int value)
tail = p;
p = p-
>next;
} tail-
>next =
newmylistnode
(key, value);}
intgethashkey
(int key)
intget
(int key)
p = p-
>next;
}return-1
;}void
remove
(int key)
prev = p;
p = p-
>next;}}
private
:// the closest prime number around 1000 is 997 and 1009
const
static
int n =
1009
; vector> nums;
};
這裡面也是定義了乙個vector陣列,只不過陣列的元素是鍊錶。我們需要定義乙個鍊錶結構體,裡面存放鍵、值、指向下乙個節點的指標。
其時間和空間效率和開放定址法差不多,時間效率稍好。
個人覺得,在儲存查詢方面拉鍊法是有優勢的。比如我們如果在位置1發生了雜湊衝突,拉鍊法只需要增加乙個節點,查詢也只需要多查一次,而開放定址法在1發生衝突後,儲存查詢次數還要受到2,3,4,5等位置的影響,如果2,3,4,5都有元素,那麼要一直到6才能儲存並找到,效率低了。
706 設計雜湊對映
不使用任何內建的雜湊表庫設計乙個雜湊對映 具體地說,你的設計應該包含以下的功能 put key,value 向雜湊對映中插入 鍵,值 的數值對。如果鍵對應的值已經存在,更新這個值。get key 返回給定的鍵所對應的值,如果對映中不包含這個鍵,返回 1。remove key 如果對映中存在這個鍵,刪...
706 設計雜湊對映
不使用任何內建的雜湊表庫設計乙個雜湊對映 具體地說,你的設計應該包含以下的功能 put key,value 向雜湊對映中插入 鍵,值 的數值對。如果鍵對應的值已經存在,更新這個值。get key 返回給定的鍵所對應的值,如果對映中不包含這個鍵,返回 1。remove key 如果對映中存在這個鍵,刪...
706 設計雜湊對映
題目描述 不使用任何內建的雜湊表庫設計乙個雜湊對映 具體地說,你的設計應該包含以下的功能 put key,value 向雜湊對映中插入 鍵,值 的數值對。如果鍵對應的值已經存在,更新這個值。get key 返回給定的鍵所對應的值,如果對映中不包含這個鍵,返回 1。remove key 如果對映中存在...