【題目描述】
The size of the hash table is not determinate at the very beginning. If the total size of keys is too large (e.g. size >= capacity / 10), we should double the size of the hash table and rehash every keys. Say you have a hash table looks like below:
size=3,capacity=4
[null, 21, 14, null]
↓ ???↓
9 ??null
↓
null
The hash function is:
int hashcode(int key, int capacity) {
return key % capacity;
}
here we have three numbers, 9, 14 and 21, where 21 and 9 share the same position as they all have the same hashcode 1 (21 % 4 = 9 % 4 = 1). We store them in the hash table by linked list.
rehashing this hash table, double the capacity, you will get:
size=3,capacity=8
index: ??0 ???1 ???2 ???3 ????4 ???5 ???6 ??7
hash : [null, 9, null, null, null, 21, 14, null]
Given the original hash table, return the new hash table after rehashing .
Notice
For negative integer in hash table, the position can be calculated as follow:
·C++/Java: if you directly calculate -4 % 3 you will get -1. You can use function: a % b = (a % b + b) % b to make it is a non negative integer.
·Python: you can directly use -1 % 3, you will get 2 automatically.
·
哈希表容量的大小在一開(kāi)始是不確定的稍途。如果哈希表存儲(chǔ)的元素太多(如超過(guò)容量的十分之一),我們應(yīng)該將哈希表容量擴(kuò)大一倍,并將所有的哈希值重新安排惧眠。假設(shè)你有如下一哈希表:
size=3,capacity=4
[null, 21, 14, null]
↓ ???↓
9 ??null
↓
null
哈希函數(shù)為:
int hashcode(int key, int capacity) {
return key % capacity;
}
這里有三個(gè)數(shù)字9,14瞬女,21剂陡,其中21和9共享同一個(gè)位置因?yàn)樗鼈冇邢嗤墓V?(21 % 4 = 9 % 4 = 1)左医。我們將它們存儲(chǔ)在同一個(gè)鏈表中。
重建哈希表特姐,將容量擴(kuò)大一倍晶丘,我們將會(huì)得到:
size=3,capacity=8
index: ??0 ???1 ???2 ???3 ????4 ???5 ???6 ??7
hash : [null, 9, null, null, null, 21, 14, null]
給定一個(gè)哈希表,返回重哈希后的哈希表唐含。
【注】:哈希表中負(fù)整數(shù)的下標(biāo)位置可以通過(guò)下列方式計(jì)算:
·C++/Java:如果你直接計(jì)算-4 % 3浅浮,你會(huì)得到-1,你可以應(yīng)用函數(shù):a % b = (a % b + b) % b得到一個(gè)非負(fù)整數(shù)捷枯。
·Python:你可以直接用-1 % 3滚秩,你可以自動(dòng)得到2。
·
【題目鏈接】
www.lintcode.com/en/problem/rehashing/
【題目解析】
此題的難度不大淮捆,只需要按照題目的要求實(shí)現(xiàn)代碼就可以郁油。不過(guò)需要注意的是:
1、C++/Java中攀痊,不能直接對(duì)負(fù)數(shù)使用取模運(yùn)算桐腌,而需要用等式a % b = (a % b + b) % b,讓所得到的hash值為非負(fù)數(shù)蚕苇。
2哩掺、所得到的新的HashTable中,可能依然存在碰撞涩笤,所以仍然需要在對(duì)應(yīng)hashcode位置的ListNode tail上插入新的ListNode嚼吞。
【參考答案】