【数据结构07】Java实现哈希表HashTable及其详解(数组+链表)

哈希表

概述

散列表(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);
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值