Design a HashSet without using any built-in hash table libraries.html
To be specific, your design should include these functions:数组
add(value)
: Insert a value into the HashSet. contains(value)
: Return whether the value exists in the HashSet or not.remove(value)
: Remove a value in the HashSet. If the value does not exist in the HashSet, do nothing.
Example:数据结构
MyHashSet hashSet = new MyHashSet(); hashSet.add(1); hashSet.add(2); hashSet.contains(1); // returns true hashSet.contains(3); // returns false (not found) hashSet.add(2); hashSet.contains(2); // returns true hashSet.remove(2); hashSet.contains(2); // returns false (already removed)
Note:函数
[0, 1000000]
.[1, 10000]
.
这道题让咱们设计HashSet,不能用自带的哈希表的数据结构,并且要咱们主要实现添加,删除,以及判断是否存在,这三个函数。咱们都知道HashSet最有用的地方就是其可以在常数的时间内判断某个元素是否存在,这都得归功于哈希表的做用。可是如今不让咱们用了,但咱们仍是得保证其常数级的查找效率,那么就用空间来换时间吧。既然题目中说了数字的范围不会超过1000000,那么咱们就申请这么大空间的数组,这样对于在HashSet中的数字,咱们就将其标记为1,不在或者删除了的就标记为0,检测的时候就看其值是否为1便可,参见代码以下:post
解法一:优化
class MyHashSet { public: /** Initialize your data structure here. */ MyHashSet() { data.resize(1000000, 0); } void add(int key) { data[key] = 1; } void remove(int key) { data[key] = 0; } /** Returns true if this set contains the specified element */ bool contains(int key) { return data[key] == 1; } private: vector<int> data; };
咱们能够来适度的优化一下空间复杂度,因为存入HashSet的数字也许不会跨度很大,那么直接就申请长度为1000000的数组可能会有些浪费,那么咱们其实可使用1000个长度为1000的数组来代替,那么就要用个二维数组啦,实际上开始咱们只申请了1000个空数组,对于每一个要处理的元素,咱们首先对1000取余,获得的值就看成哈希值,对应咱们申请的那1000个空数组的位置,在加入元素时,一旦计算出了哈希值,咱们将对应的空数组resize为长度1000,而后根据哈希值和key/1000来肯定具体的加入位置。移除数字同样的,先计算出哈希值,若是对应的数组不为空的话,找到对应的位置并赋值为0。不过你们也能够看出来,咱们在加入元素时会开辟1000的新空间,可是删除这个元素时,并无检测这1000个位置是否均为0,是的话应该删除这1000个新空间。可是这样可能会使得删除函数变慢一些,参见代码以下: ui
解法二:this
class MyHashSet { public: /** Initialize your data structure here. */ MyHashSet() { data.resize(1000, vector<int>()); } void add(int key) { int hashKey = key % 1000; if (data[hashKey].empty()) { data[hashKey].resize(1000); } data[hashKey][key / 1000] = 1; } void remove(int key) { int hashKey = key % 1000; if (!data[hashKey].empty()) { data[hashKey][key / 1000] = 0; } } /** Returns true if this set contains the specified element */ bool contains(int key) { int hashKey = key % 1000; return !data[hashKey].empty() && data[hashKey][key / 1000]; } private: vector<vector<int>> data; };
相似题目:url
参考资料:
https://leetcode.com/problems/design-hashset/
https://leetcode.com/problems/design-hashset/discuss/185826/C%2B%2B-solution
https://leetcode.com/problems/design-hashset/discuss/193132/Solution-without-boolean-array