大一学生分享哈希表

数据结构与算法,众妙之门,魅力无穷                                

                                                    ---同行者联盟

哈希表

哈希表使用场景与详细介绍

需求:

“三分钟内,我要那个女生的全部资料”,这是我们在霸道总裁爱上我的电视剧中常听到的话,

维护一份学生人员资料信息,当输入人员学号时,要快速查到该学生的基本信息,越快越好,且不使用数据库,要节省内存

什么是哈希表:

“散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表/哈希表。

哈希表的本质及其实现方法

哈希表本质就是数组,实现方法有两种

1、数组+链表

2、数组+红黑树

哈希表示意图:

数组+链表以及数组+红黑树两种实现形式的示意图

图片

 

为什么不直接使用数组而是要使用哈希表

hash表为了实现:通过某一个关键值(一个具体业务值)可以直接取到数据,达到和数组一样的随机访问效果。但是数组的关键值只能是下标,不具有任何业务意义,所以直接使用数组是不满足我们的需求的。那我们中间加一个函数去实现:关键值 --> 下标 --> 数据,这个就是hash函数。

哈希冲突是什么以及如何解决

哈希冲突:不同的输入数据在经过哈希函数计算后,产生了相同的哈希值。即k1 != k2,但H(k1) = H(k2),这种现象就是哈希冲突。

举个例子,比如哈希函数是:  哈希值 = 关键字 mod 10,那13和23就会产生哈希冲突,因为会映射到同一个地址上,就会产生哈希冲突

怎样解决:

F1: 开放址法

基本思想:当哈希冲突发生时,采用一定的规则在哈希表中寻找下一个可用的槽,直到找到一个空槽或者达到某个阈值为止;

对阈值的解释:

数组的长度为16,加载因子设为0.75,阈值就是总长度*加载因子的值,当已经插入的元素个数超过阈值时,需要对哈希表进行扩容操作。因为此时发生哈希冲突的概率会增大

如:

数据关键字:15 2 38 28 4 12

数组大小:13

哈希函数为 下标=关键字 mod 13

如下图,元素 15 已经占据了下标为 2 的位置,元素 2 本身也应该占据下标为 2 的位置,这时遇到哈希冲突,它就往下一个地址寻找空位。

如果遇到冲突,就往下一个地址寻找空位。新地址 = 原始位置+i(i是查找次数)

F2: 链接法 

(又叫拉链法, HashMap底层就是这样处理的)

基本思想: 将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

如:数据关键字:19,14,23,01,68,20,84,27,55,11,10,79

哈希表长度:13

哈希函数为:哈希值 = key % 13

解决需求:来实现哈希表的创建及其使用

1、哈希表的创建

创建学生类

/** 
  创建学生类
 **/
class Student {
    public int id;
    public String name;
    public int age;
    public String addr;
    public Student next;

    public Student(int id, String name, int age, String addr) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", addr='" + addr + '\'' +
                '}';
    }
}

创建学生链表

/**
  创建学生链表
 **/
class StudentList {
    public Student head;

    public void addStudent(Student student) {
       if (head == null) {
           head = student;
           return;
       }
       Student cur = head;
       while (true) {
           if (cur.next == null) {
               break;
            }
            cur = cur.next;
        }
        cur.next = student;
    }
}

创建学生哈希表,用于管理链表

class StudentHashTable {
    StudentList[] studentLists;
    int maxSize;

    public StudentHashTable(int maxSize) {
        studentLists = new StudentList[maxSize];
        this.maxSize = maxSize;
        //初始化链表数组
        for (int i = 0; i < maxSize; i++) {
            studentLists[i] = new StudentList();
        }
    }
}

2、哈希表实现学生信息的插入操作(不考虑学生重复插入)

// 实现添加学生的方法
public void addStudent(Student student) {
    // 根据哈希函数,获取学生应该对应的下标

   int stuId = student.id % maxSize;
    // 将学生插入到该条链表中
    studentLists[stuId].addStudent(student);

}

3、哈希表实现学生信息的遍历输出

学生链表类中实现遍历学生的方法

public void showStudent(int index) {
    if (head == null) {
        System.out.println("下标"+index+"下,链表为空,没有学生信息可以输出");
        return;
    }
    System.out.println("下标"+index+"下的学生信息分别是:");
    Student cur = head;
    System.out.println(cur.toString());
    while (true) {
        if (cur.next == null) {
            break;
        }
        cur = cur.next;
        System.out.println(cur.toString());
    }
}
 

哈希表中实现遍历每一个索引​​​​​​

/**
 *   遍历学生
 **/
public void showStudent() {
    for (int i = 0; i < studentLists.length; i++) {
        studentLists[i].showStudent(i);
    }
}

4、哈希表实现根据对应学号快速找到对应学生信

学生链表类中实现通过学号获取学生信息的方法​​​​​​​

public void getStudentById(int id) {
    if (head == null) {
        System.out.println("不存在学号为" + id+ "的学生");
        return;
    }
    // 辅助节点初始化为头节点,即数组下标位置所代表的学生
    Student cur = head;
    // 遍历链表
    while (true) {
        if(cur.id == id){
            System.out.println("学号为"+id+"的同学信息为"+cur.toString());
            break;
        }
        if (cur.next == null) {
            System.out.println("不存在学号为" + id+ "的学生");
            break;
        }
        cur = cur.next;
    }
}

哈希表中实现的通过学号获取学生信息的方法

public void getStudentById(int id) {
    // 根据学号找到对应的数组下标
    int index = id % maxSize;
    studentLists[index].getStudentById(id);
}

测试实例​​​​​​​​​​​​​​

public static void main(String[] args) {
    StudentHashTable studentHashTable = new StudnetHashTable(3);
    for (int i = 1; i <= 6; i++) {
        Student stu = new Student(i, "zs" + i, 20 + i, "aaa" + i);
        studentHashTable.addStudent(stu);
    }
    studentHashTable.showStudent();
    studentHashTable.getStudentById(5);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/702678.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CUDA、CUDNN、Torch的配置

文章目录 一、 配置CUDA1.CUDA下载2.CUDA安装3.CUDA配置环境4.CUDA是否配置成功 三、 配置CUDNN四、配置torch1.创建Python 3.8环境并激活2.下载torch-GPU版本 一、 配置CUDA WinR打开命令行&#xff0c;输入cmd&#xff0c;在终端输入&#xff1a;nvidia-smi。 查看本机的GPU…

海洋CMS /js/player/dmplayer/dmku/ SQL注入漏洞复现(CVE-2024-29275)

0x01 产品简介 海洋CMS是一套专为不同需求的站长而设计的内容管理系统&#xff0c;灵活、方便、人性化设计、简单易用是最大的特色&#xff0c;可快速建立一个海量内容的专业网站。海洋CMS基于PHPMySql技术开发&#xff0c;完全开源免费 、无任何加密代码。 0x02 漏洞概述 海…

CTF-AWD入门手册

引文 AWD赛制是一种网络安全竞赛的赛制。AWD赛制由安全竞赛专家及行业专家凭借十多年实战经验&#xff0c;将真实网络安全防护设备设施加入抽象的网络环境中&#xff0c;模拟政府、企业、院校等单位的典型网络结构和配置&#xff0c;开展的一种人人对抗的竞赛方式&#xff0c;…

使用itextPDF实现PDF电子公章工具类

一、制作公章 在线网站&#xff1a;印章生成器 - Kalvin在线工具 (kalvinbg.cn) 然后对公章进行下载保存 盖章图片&#xff1a; 二、生成数字签名 2.1&#xff1a; java工具keytool生成p12数字证书文件 Keytool是用于管理和证书的工具&#xff0c;位于%JAVA_HOME%/bin目录。…

深入理解Qt多线程编程(QThreadPool)

多线程编程在现代软件开发中变得越来越重要&#xff0c;它能够提高应用程序的响应速度和处理性能。在Qt框架中&#xff0c;QThreadPool作为线程池管理工具&#xff0c;被频繁的使用。 目录 概述 接口介绍 底层原理解析 使用方法 概述 QThreadPool是Qt提供的一个线程池实现&a…

计算机视觉全系列实战教程:(八)图像变换-点运算、灰度变换、直方图变换

图像变换&#xff1a;点运算、灰度变换、直方图变换 1.点运算(1)What(2)Why 2.灰度变换(1)What(2)Why(作用)(3)Which(有哪些灰度变换&#xff09; 3.直方图修正(1)直方图均衡化 1.点运算 (1)What 通过点运算&#xff0c;输出图像的每个像素的灰度值仅仅取决于输入图像中相对应…

eNSP学习——PPP的认证

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建OSPF网络 3、配置PPP的PAP认证 4、配置PPP的CHAP认证 主要命令 //设置本端的PPP协议对对端设备的认证方式为 PAP&#xff0c;认证采用的域名为huawei [R3]int s4/0/0 [R…

C语言 RTC时间(年月日时分秒) 和 时间戳 互相转换

一、介绍 在C语言中&#xff0c;将年月日时分秒转换为时间戳&#xff08;Unix时间戳&#xff0c;即从1970年1月1日00:00:00 UTC到现在的秒数&#xff09;通常需要使用struct tm结构体和timegm或mktime函数。&#xff08;注意&#xff0c;mktime函数假设struct tm是本地时间&…

面试题分享之JVM篇

注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 系列文章目录 面试题分享之Java并发篇面试题分享之Java集合篇&#xff08;二&#xff09; 前言 学过Java的小伙伴肯定对JVM&#xff08;Java虚拟机&#xff09;多多少少了解一点&#xff0c…

工程项目管理系统:高效、专业的工程管理软件

在当今快速发展的工程行业&#xff0c;有效的项目管理是确保项目成功的关键。鸿鹄工程项目管理系统&#xff0c;基于Spring Cloud、Spring Boot、Mybatis、Vue和ElementUI技术栈&#xff0c;提供了一个全面、高效的解决方案&#xff0c;以应对复杂的工程项目管理挑战。 项目背景…

ChatGLM3-6B-32K 在linux(Ubuntu) GPU P100(16G)复现记录

ChatGLM3-6B-32K 在linux(Ubuntu) GPU P100(16G)复现记录 时间&#xff1a;2024年6月12日 1.创建Conda环境 conda create --name chatglm3 python3.10 conda activate chatglm32.下载chatglm&#xff0c;并安装依赖 如果没有安装git命令&#xff0c;先安装git命令 sudo ap…

开展文化科技卫生“三下乡”活动怎样向媒体投稿宣传?

在新时代背景下&#xff0c;“文化科技卫生三下乡”活动作为推动乡村振兴、促进城乡融合发展的重要举措&#xff0c;正发挥着不可小觑的作用。这类活动通过输送文化、科技、卫生等领域的资源和服务到农村&#xff0c;极大地丰富了农民的精神生活&#xff0c;提升了农村的科学素…

【目标检测】基于深度学习的车牌识别管理系统(含UI界面)【python源码+Pyqt5界面 MX_002期】

系统简介&#xff1a; 车牌识别技术作为经典的机器视觉任务&#xff0c;具有广泛的应用前景。通过图像处理方法&#xff0c;车牌识别技术能够对车牌上的字符进行检测、定位和识别&#xff0c;从而实现计算机对车牌的智能化管理。在现实生活中&#xff0c;车牌识别系统已在小区停…

前端传递bool型后端用int收不到

文章目录 背景模拟错误点解决方法 背景 我前几天遇到一个低级错误&#xff0c;就是我前端发一个请求&#xff0c;把参数送到后端&#xff0c;但是我参数里面无意间传的布尔型&#xff08;刚开始一直没注意到&#xff0c;因为当时参数有十几个&#xff09;&#xff0c;但是我后…

认证体系下的CID广告服务商:构建商家与服务商的共赢生态

摘要&#xff1a;引流电商服务商认证体系的构建促进了商家与服务商之间的顺畅合作&#xff0c;降低了风险&#xff0c;优化了资源配置。认证提升了服务商形象&#xff0c;扩大了市场份额&#xff0c;推动了行业技术创新和服务升级&#xff0c;构建了共赢生态。 在引流电商行业…

发布会后苹果股价创历史新高;商汤 Embedding 模型拿下 SOTA丨 RTE 开发者日报 Vol.223

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

免密支付存隐患 谨防“便捷”变“踩坑”

免密支付存隐患 谨防“便捷”变“踩坑” 当前&#xff0c;我国网购用户已超9亿人&#xff0c;越来越便捷的支付手段让网络消费体验更加“丝滑”。但免密支付、自动续费等方式在简化付款流程的同时&#xff0c;也成为一些平台“套路”消费者的手段&#xff0c;暗藏诱导消费陷阱。…

闪烁与常亮的符号状态判断机制(状态机算法)

背景说明 在视觉项目中&#xff0c;经常要判断目标的状态&#xff0c;例如&#xff1a;符号的不同频率闪烁、常亮等。然而常规的视觉算法例如YOLO&#xff0c;仅仅只能获取当前帧是否存在该符号&#xff0c;而无法对于符号状态进行判断&#xff0c;然而重新写一个基于时序的卷积…

跟着AI学AI_09 PyTorch 简介

PyTorch 简介 PyTorch 是一个开源的深度学习框架&#xff0c;由 Facebook 的人工智能研究团队&#xff08;FAIR&#xff09;开发。它提供了灵活且高效的张量计算功能&#xff0c;并支持动态计算图。PyTorch 的易用性和灵活性使其成为深度学习研究和生产应用中广泛使用的工具。…

一维、二维数组练习题

1、输入一个6个元素的一维数组&#xff0c;实现冒泡排序 2、输入一个6个元素的一维数组&#xff0c;实现简单排序 3、输入一个5个元素的一维数组&#xff0c;求最大值&#xff0c;最小值 4、输入一个三行四列的二维数组&#xff0c;计算最大值和最小值