哈希集合底层由数组+集合/链表进行实现
实现 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函数不过多赘述,是前面两个函数的基础通过哈希表可有效提高搜索的速率,大大降低时间复杂度
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(); } } public void add(int key) { //哈希函数"输入值" int h = hash(key); //利用迭代器在链表进行遍历 Iterator 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 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 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 ,(已移除) } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)