哈希表

概念介绍

  有同学想了解哈希表,今天它来了!哈希表也叫做散列表,是一种根据Key值而直接进行访问的数据结构。它通过把Key值映射到表中一个位置来访问所存储的元素,对Key值进行映射的函数我们称之为散列函数,而存放记录的数组叫做散列表(概念如果不好理解,大家可以略过)。

  概念有时很抽象,咱们举个简单的栗子进行说明。

  现在咱们定义一个长度为10的数组用以进行数据进行存储,它长这个样子

  有一个同学,学号为1的小明同学,咱们需要把他的信息存储到数组中,该怎么添加和查找呢?

  咱们先简单的定义散列函数:取模,即f(Key)=Key%10,f(1) = 1%10 =1,即将小明同学的信息放入数组的a[1]的位置,查找的时候,也是同样的道理,先对Key进行hash,然后找,hash表是不是很简单呢?

  但是现在有一个学号为11的小王同学的信息也要添加进来,根据散列函数f(Key)=Key%10,f(11)=1。位置和小明冲突了,hash表是支持一山可容二虎的,该怎么做呢?用咱们原来学过的链表来处理,就行了。

  最终结果,如图

代码实现

  1、先定义学生对象

1 class Student {
2     public int id;
3     public String name;
4 
5     public Student(int id, String name) {
6         this.id = id;
7         this.name = name;
8     }
9 }

  2、定义咱们的hash表结构为数组+链表,简单的hash实现,取模处理

 1 public class HashTable {
 2 
 3     private LinkedList[] studentLinkedListArray;
 4     private int size;
 5 
 6     public HashTable(int size) {
 7         this.size = size;
 8         studentLinkedListArray = new LinkedList[size];
 9     }
10 
11     private  int hash(int id) {
12         return id % size;
13     }
14 }

  3、添加学生的方法,hash找到数组下标的位置,再添加

 1     public void add(Student stu) {
 2         // 先对id进行hash,找到放入数组的下标位置
 3         int no = hash(stu.id);
 4         if(studentLinkedListArray[no]==null){
 5             LinkedList<Student> linkedList = new LinkedList<>();
 6             linkedList.add(stu);
 7             studentLinkedListArray[no] = linkedList;
 8         }
 9         else {
10             studentLinkedListArray[no].add(stu);
11         }
12     }

  4、实现根据id查询对象的方法

 1     public void getById(int id){
 2         // 先对id进行hash,找到数组的下标位置
 3         int no = hash(id);
 4         if(studentLinkedListArray[no]==null){
 5             System.out.printf("没有找到id为%d的学生",id);
 6         }
 7         else {
 8             // 遍历链表中的节点,根据id判断元素是否存在
 9             Iterator it = studentLinkedListArray[no].iterator();
10             while (it.hasNext()){
11                 Student stu = (Student)it.next();
12                 if(id == stu.id){
13                     System.out.printf("找到id为%d的学生",id);
14                     return;
15                 }
16             }
17             System.out.printf("没有找到id为%d的学生",id);
18         }
19     }

  打完收工,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具体实现位于data-structure工程下的hash目录,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你介绍更多数据结构!

posted @ 2019-11-12 16:14  一马关月  阅读(189)  评论(0编辑  收藏  举报