1.基本原理
哈希集合底层由数组+集合/链表进行实现
2.实现方法
实现 MyHashSet 类:
- void add(key) 向哈希集合中插入值 key 。
- bool contains(key) 返回哈希集合中是否存在这个值 key 。
- void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。
- int hash(int key) 哈希函数,将给定值可以进行"翻译"成对应的哈希值,提高搜索效率
3.实现方法详解
- 具体由hash函数对输入的数值计算得到其哈希值,再将其作为数组下标,而数组元素则为存储输入数值的集合,或者可以说为链表的表头
- 实现add函数时可通过hash函数找到将存入的链表表头在数组中的下标位置,再通过迭代器即可实现,元素的添加
- 实现remove函数可通过hash函数得到的hashcode快速找到其对应的链表,再通过迭代器可快速找到元素所在位置,并进行移除操作
- 实现contain函数不过多赘述,是前面两个函数的基础
- 通过哈希表可有效提高搜索的速率,大大降低时间复杂度
4.代码讲解以及测试用例
/*
哈希集合
*/
class MyHashSet {
//定义底层数据结构所用的数组
private static final int base = 769;
private LinkedList[] data;
//定义哈希集合
public MyHashSet() {
//建立数组
this.data = new LinkedList[base];
//建立链表
for (int i = 0; i < base; i++) {
data[i] = new LinkedList<Integer>();
}
}
public void add(int key) {
//哈希函数"输入值"
int h = hash(key);
//利用迭代器在链表进行遍历
Iterator<Integer> iterator = data[h].iterator();
while (iterator.hasNext()){
//哈希集合元素不可重复,遇到重复元素时直接返回,不用进行添加操作
if (iterator.next() == key){
return;
}
}
//在表尾增加元素
data[h].offerLast(key);
return;
}
public void remove(int key) {
int h = hash(key);
Iterator<Integer> iterator = data[h].iterator();
while (iterator.hasNext()){
Integer element = iterator.next();
if (element == key){
data[h].remove(element);
return;
}
}
}
public boolean contains(int key) {
int h = hash(key);
Iterator<Integer> iterator = data[h].iterator();
while (iterator.hasNext()){
if (iterator.next() == key){
return true;
}
}
return false;
}
//哈希函数得到hashcode
public int hash(int key){
return key % this.base;
}
}
测试用例
public class Application {
public static void main(String[] args) {
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 ,(已移除)
}
}