leetcode706 - Design HashMap - easy
Design a HashMap without using any built-in hash table libraries.
To be specific, your design should include these functions:
put(key, value)
: Insert a (key, value) pair into the HashMap. If the value already exists in the HashMap, update the value.get(key)
: Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key.remove(key)
: Remove the mapping for the value key if this map contains the mapping for the key.
Example:
MyHashMap hashMap = new MyHashMap(); hashMap.put(1, 1); hashMap.put(2, 2); hashMap.get(1); // returns 1 hashMap.get(3); // returns -1 (not found) hashMap.put(2, 1); // update the existing value hashMap.get(2); // returns 1 hashMap.remove(2); // remove the mapping for 2 hashMap.get(2); // returns -1 (not found)
Note:
- All keys and values will be in the range of
[0, 1000000]
. - The number of operations will be in the range of
[1, 10000]
. - Please do not use the built-in HashMap library.
最简单的办法,用一个1000000大小的array,idx是key,idx上的值是value。但一开始key不会都分散的那么开,所以用一个hash function。
定义hash function为f(x) = x%(some prime number) - so keys are uniformly distributed.
How to handle collision: using buckets for the same hash output (or address).
比如说大家都mode 997, 那1和998会被mapped到同一个位置,但注意这些数相互之前肯定都差997,所以key/997就能将他们区分开。
每当有key要映射到一个addr的时候,把这个addr展开成一排buckets,相当于准备做chaining。
实现:Time O(n/k), k-hashNum we chose
class MyHashMap { int hashNum; vector<vector<int>> data; public: /** Initialize your data structure here. */ MyHashMap() { hashNum = 1031; data.resize(hashNum, vector<int>()); } /** value will always be non-negative. */ void put(int key, int value) { int hashRes = key%hashNum; if (data[hashRes].empty()) data[hashRes].resize(970, -1); data[hashRes][key/hashNum] = value; } /** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */ int get(int key) { int hashRes = key%hashNum; if (data[hashRes].empty()) return -1; return data[hashRes][key/hashNum] >=0 ? data[hashRes][key/hashNum] : -1 ; } /** Removes the mapping of the specified value key if this map contains a mapping for the key */ void remove(int key) { int hashRes = key%hashNum; if (!data[hashRes].empty()) data[hashRes][key/hashNum] = -1; } };