数据结构与算法—哈希表

哈希表

文章目录

  • 哈希表
    • 1. 问题引出
    • 2. 基本介绍
    • 3. 应用实例

1. 问题引出

  看一个实际需求,google公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄等),当输入该员工的id时,要求查到该员工的所有信息。要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)。

2. 基本介绍

  散列表 (Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数据叫做散列表。

在这里插入图片描述

图1 哈希表

在这里插入图片描述

图2 哈希表的应用

3. 应用实例

题目:有一个公司,当有新元哦概念股来报道时,就将该员工的信息加入(id,name),当输入该员工的id时,要求找到该员工的所有信息

要求:不使用数据库,速度越快越好 => 哈希表

在这里插入图片描述

图3 程序结构框图

代码如下[包含 增 删 查]

class HashTab {  //哈希表//定义大小为size的EmpLinkedList数组private int size;private EmpLinkedList[] empLinkedLists;public HashTab(int size) {this.size = size;//设置大小empLinkedLists = new EmpLinkedList[size];//但是注意!!!//数组大小虽然决定了 但是数组里的元素默认初始化为null//即每个EmpLinkedList = null;//需要初始化for (int i = 0; i < size; i++) {empLinkedLists[i] = new EmpLinkedList();//初始化每个元素链表}}public void findEmpById(int no) {  //通过Id找对象//empLinkedLists[hashFun(no)] 找到对应的链表//.find(no) 在对应的链表中找相应的节点empLinkedLists[hashFun(no)].find(no);}public void delete(int no){ //根据编号删除对应元素//empLinkedLists[hashFun(emp.getId())] 找到对应的链表//.delete在对应的链表中删除节点empLinkedLists[hashFun(no)].delete(no);}public void add(Emp emp) {   //添加元素到哈希表中//empLinkedLists[hashFun(emp.getId())] 找到对应的链表//.add添加对象到对应的链表中empLinkedLists[hashFun(emp.getId())].add(emp);}public void list() { //显示哈希表中的数据for (int i = 0; i < size; i++) {empLinkedLists[i].list(i);   //依次显示每一条链表的数据}}public int hashFun(int no) {   //散列函数 用来决定数据放哪一个链表return no % size;   //返回编号对size的取模}
}class EmpLinkedList {    //定义Emp链表private Emp head = null;    //定义头节点public void add(Emp emp) {   //添加新员工 直接添加到最后一个位置if (head == null) {   //如果头节点是空的head = emp; //直接把头节点指向次员工return;}Emp temp = head;while (temp.getNext() != null) {//遍历到最后一个节点退出循环temp = temp.getNext();   //继续下一个节点}//退出循环后 此节点指向最后一个节点temp.setNext(emp);  //将最后一个节点next指向新的节点}public void delete(int no) { //根据no号删除对应的节点if (head == null) {System.out.println("此处无垠三变量");return;} else if (head.getId() == no) {   //如果头节点就是要删除的对象head = head.getNext();  //则直接头节点后移就行了return;}Emp temp = head;while (temp.getNext() != null) {if (temp.getNext().getId() == no) { //如果下一个节点是删除的节点temp.setNext(temp.getNext().getNext()); //将temp的next指向后面第二位break;}temp = temp.getNext();  //否则后移 继续判断下一位}}public void find(int no) {   //查找对应no是否存在if (head == null) {System.out.println("目标不存在");return;}Emp temp = head;while (temp != null) {//遍历每一个节点if (temp.getId() == no) { //说明找到了对应的目标System.out.println(temp);   //输出对应的信息return;}temp = temp.getNext();   //继续下一个节点}//正常退出循环后 说明目标不存在System.out.println("目标不存在");}public void list(int no) { //显示链表if (head == null) {   //说明为空System.out.println("第" + (no + 1) + "条链表为空");return;}Emp temp = head;System.out.print("第" + (no + 1) + "条链表:");while (temp != null) {//遍历每一个节点System.out.print(temp + " ");temp = temp.getNext();   //继续下一个节点}System.out.println();}
}class Emp {  //定义Emp节点private int Id; //编号private String name;    //名字private Emp next;   //指向下一个节点 默认为nullpublic Emp(int id, String name) {   //构造器Id = id;this.name = name;}public Emp getNext() {return next;}public void setNext(Emp next) {this.next = next;}public int getId() {return Id;}public void setId(int id) {Id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "{" +"Id=" + Id +", name='" + name + '\'' +", next=" + (next == null ? null : next.hashCode()) +'}';}
}

其实整个代码不难理解,就是在链表的基础上,创建了多个链表进行管理。看韩老师敲一遍代码,自己就能敲出来了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于MySQL的bigint问题

MySQL的bigint(8)能存多大数值&#xff1f; MySQL的BIGINT(8)可以存储的数值范围是从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。这是因为BIGINT数据类型在MySQL中使用8字节进行存储&#xff0c;每个字节有8位&#xff0c;所以总共可以表示2^64个不同的整数。 …

C语言复习之结构体指针 ; 函数指针

结构体指针 不可以这样定义&#xff1a; 应该这样定义&#xff1a;加上指针&#xff0c;因为指针是4个字节&#xff0c;这样的话&#xff0c;他的大小就确定下来了。 一个是表示结构体&#xff0c;一个是表示结构体的指针。 很容易理解&#xff0c;脑子里要有内存图。 结构…

Yoast SEO Premium v21.7 Premium WordPress 插件Yoast +子插件介绍

什么是Yoast SEO&#xff1f; Yoast SEO 是 WordPress 的 SEO 插件&#xff0c;可帮助网站所有者针对搜索引擎优化他们的网站。该插件由 Joost de Valk 于 2008 年创建&#xff0c;旨在让每个人都能访问 SEO。今天&#xff0c;Yoast SEO 是全球数百万 WordPress 用户使用的最受…

目标跟踪 MOT数据集和可视化

目录 MOT15数据集格式简介 gt可视化 本人修改的GT可视化代码&#xff1a; MOT15数据集格式简介 以下内容转自&#xff1a;【目标跟踪】MOT数据集GroundTruth可视化-腾讯云开发者社区-腾讯云 MOT15数据集下载&#xff1a;https://pan.baidu.com/s/1foGrBXvsanW8BI4eybqfWg?…

数据结构之---- 分治算法

数据结构之---- 分治算法 什么是分治算法&#xff1f; 分治&#xff0c;全称分而治之&#xff0c;是一种非常重要且常见的算法策略。 分治通常基于递归实现&#xff0c;包括 分 和 治 两个步骤&#xff1a; 分&#xff08;划分阶段&#xff09;&#xff1a;递归地将原问题分…

数据高可用架构设计与实现

大型企业如何实现 MySQL 到 Redis 的同步 前面曾提到过 Read/Write Through 和 Cache Aside 这几种更新缓存的模式或者说策略&#xff0c;这几种策略都存在缓存不命中的可能性&#xff0c;如果缓存没有命中&#xff0c;就需要直接访问数据库以获取数据。—般情况下&#xff0c…

Y4M视频文件格式

什么是Y4M 以YUV4Mpeg格式创建的视频文件;这个视频文件存储了一组未压缩的YCbCr图像&#xff0c;这些图像逐帧组成视频;在压缩成MPEG-2或Matroska等更流行的视频格式之前&#xff0c;用作原始的彩色视频格式 Y4M文件是一个纯文本格式的header开始&#xff0c;header有0或多个…

【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 组合总和1 class So…

linux笔记--VSCode利用交换机跳转服务器

目录 1--前言 2--VSCode设置 3--ssh连接 1--前言 博主学校的服务器有两个&#xff0c;其中一个服务器&#xff08;14&#xff09;可以通过挂内网VPN来进行连接&#xff0c;但另一个服务器&#xff08;15&#xff09;即使挂了VPN也不能连接&#xff0c;只能通过内网进行连接。…

Java入门学习笔记一

一、Java语言环境搭建 1、JAVA语言的跨平台原理 1.1、什么是跨平台性&#xff1f; 跨平台就是说&#xff0c;同一个软件可以在不同的操作系统&#xff08;例如&#xff1a;Windows、Linux、mad&#xff09;上执行&#xff0c;而不需要对软件做任务处理。即通过Java语言编写的…

Ansible-playbook编译.yml脚本

1、playbook是什么&#xff1f; 在Ansible中&#xff0c;Playbook是用于配置、部署和管理被控节点的剧本。它由一个或多个play&#xff08;角色&#xff09;组成&#xff0c;每个play可以包含多个task&#xff08;台词&#xff0c;动作&#xff09;。使用Ansible的Playbook&am…

轻量封装WebGPU渲染系统示例<52>- Json数据描述材质、纹理等3D渲染场景信息

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/DataDrivenScene3.ts 当前示例运行效果: ​​​​​​​ Json数据: {"renderer": {"mtplEnabled": true,"camera": {"eye&quo…