哈希表
概述
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
就是以 key : value 的形式储存数据的一种数据结构。
而对于key和value,需要给出一个函数 f(key) 计算后能求出value的地址(查找出value)
实现哈希表的方法有:数组+链表、数组+二叉树
如下图:就是数组+链表的方式实现的哈希表,数组的长度为 16
如果要查询 387,则可以用 387%15 即可的出,其在下标为3链表中,再对此链表进行查询即可
实现思路
因为数组中存储的是链表,像添加、修改、查找…等方法,链表中都会有,我们只需要确定,我们要操作哪一条链表即可。所以我们只需要实现一个哈希函数的方法,用来确定某一节点应该加入到哪个链表中即可,这里我选择用 id取余法,即 传入一个节点的 编号 % 数组长度-1 取余即可。
关于链表我写了相应的博客,也有相应的代码,可以移步:查看单链表链表详解
实现代码
package hash_table;
import linked_list.SingleLinkedList;
import linked_list.SingleNode;
public class HashTable {
public static void main(String[] args) {
HashTable hashTable = new HashTable(7);
SingleNode node1 = new SingleNode(1,"张三");
SingleNode node2 = new SingleNode(2,"李四");
SingleNode node3 = new SingleNode(3,"王五");
hashTable.add(node1);
hashTable.add(node2);
hashTable.add(node3);
hashTable.show();
System.out.println("=====查找=====");
System.out.println(hashTable.findByNo(2));
}
private int size;
public SingleLinkedList[] linkedLists;
public HashTable(int size) {
this.size = size;
linkedLists = new SingleLinkedList[size];
for (int i = 0; i < size; i++) {
linkedLists[i] = new SingleLinkedList();
}
}
//向哈希表中添加元素
public void add(SingleNode node){
//传入节点的编号,通过哈希函数确定其添加入哪一条链表
int index = hashFun(node.no);
linkedLists[index].addTail(node);
}
//遍历展示hashTable
public void show(){
for (int i = 0; i < size; i++) {
System.out.println("第"+ i +"条链表");
linkedLists[i].show();
}
}
//根据no查找元素
public SingleNode findByNo(int no){
int index = hashFun(no);
return linkedLists[index].findNodeByNo(no);
}
//哈希(Hash) 函数
public int hashFun(int id){
return id % (size-1);
}
}