第 9 章 哈希表

文章目录

  • 9.1 哈希表(散列)-Google 上机题
  • 9.2 哈希表的基本介绍
  • 9.3 google 公司的一个上机题:

9.1 哈希表(散列)-Google 上机题

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

9.2 哈希表的基本介绍

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

9.3 google 公司的一个上机题:

有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的 id 时,要求查找到该员工的 所有信息.

要求:

  1. 不使用数据库,速度越快越好=>哈希表(散列)

  2. 添加时,保证按照 id 从低到高插入 [课后思考:如果 id 不是从低到高插入,但要求各条链表仍是从低到高,怎么解决?]

  3. 使用链表来实现哈希表, 该链表不带表头[即: 链表的第一个结点就存放雇员信息]

  4. 思路分析并画出示意图
    在这里插入图片描述

  5. 代码实现

    package com.atguigu.hashtab;import java.util.Scanner;public class HashTabDemo {public static void main(String[] args) {//创建哈希表HashTab hashTab = new HashTab(7);//写一个简单的菜单String key = "";Scanner scanner = new Scanner(System.in);while(true) {System.out.println("add:  添加雇员");System.out.println("list: 显示雇员");System.out.println("find: 查找雇员");System.out.println("exit: 退出系统");key = scanner.next();switch (key) {case "add":System.out.println("输入id");int id = scanner.nextInt();System.out.println("输入名字");String name = scanner.next();//创建 雇员Emp emp = new Emp(id, name);hashTab.add(emp);break;case "list":hashTab.list();break;case "find":System.out.println("请输入要查找的id");id = scanner.nextInt();hashTab.findEmpById(id);break;case "exit":scanner.close();System.exit(0);default:break;}}}}//创建HashTab 管理多条链表
    class HashTab {private EmpLinkedList[] empLinkedListArray;private int size; //表示有多少条链表//构造器public HashTab(int size) {this.size = size;//初始化empLinkedListArrayempLinkedListArray = new EmpLinkedList[size];//?留一个坑, 这时不要分别初始化每个链表for(int i = 0; i < size; i++) {empLinkedListArray[i] = new EmpLinkedList();}}//添加雇员public void add(Emp emp) {//根据员工的id ,得到该员工应当添加到哪条链表int empLinkedListNO = hashFun(emp.id);//将emp 添加到对应的链表中empLinkedListArray[empLinkedListNO].add(emp);}//遍历所有的链表,遍历hashtabpublic void list() {for(int i = 0; i < size; i++) {empLinkedListArray[i].list(i);}}//根据输入的id,查找雇员public void findEmpById(int id) {//使用散列函数确定到哪条链表查找int empLinkedListNO = hashFun(id);Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id);if(emp != null) {//找到System.out.printf("在第%d条链表中找到 雇员 id = %d\n", (empLinkedListNO + 1), id);}else{System.out.println("在哈希表中,没有找到该雇员~");}}//编写散列函数, 使用一个简单取模法public int hashFun(int id) {return id % size;}}//表示一个雇员
    class Emp {public int id;public String name;public Emp next; //next 默认为 nullpublic Emp(int id, String name) {super();this.id = id;this.name = name;}
    }//创建EmpLinkedList ,表示链表
    class EmpLinkedList {//头指针,执行第一个Emp,因此我们这个链表的head 是直接指向第一个Empprivate Emp head; //默认null//添加雇员到链表//说明//1. 假定,当添加雇员时,id 是自增长,即id的分配总是从小到大//   因此我们将该雇员直接加入到本链表的最后即可public void add(Emp emp) {//如果是添加第一个雇员if(head == null) {head = emp;return;}//如果不是第一个雇员,则使用一个辅助的指针,帮助定位到最后Emp curEmp = head;while(true) {if(curEmp.next == null) {//说明到链表最后break;}curEmp = curEmp.next; //后移}//退出时直接将emp 加入链表curEmp.next = emp;}//遍历链表的雇员信息public void list(int no) {if(head == null) { //说明链表为空System.out.println("第 "+(no+1)+" 链表为空");return;}System.out.print("第 "+(no+1)+" 链表的信息为");Emp curEmp = head; //辅助指针while(true) {System.out.printf(" => id=%d name=%s\t", curEmp.id, curEmp.name);if(curEmp.next == null) {//说明curEmp已经是最后结点break;}curEmp = curEmp.next; //后移,遍历}System.out.println();}//根据id查找雇员//如果查找到,就返回Emp, 如果没有找到,就返回nullpublic Emp findEmpById(int id) {//判断链表是否为空if(head == null) {System.out.println("链表为空");return null;}//辅助指针Emp curEmp = head;while(true) {if(curEmp.id == id) {//找到break;//这时curEmp就指向要查找的雇员}//退出if(curEmp.next == null) {//说明遍历当前链表没有找到该雇员curEmp = null;break;}curEmp = curEmp.next;//以后}return curEmp;}}
    

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

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

相关文章

软件测试|PyQt5实战教程(一)安装与环境配置

简介 我们之前介绍过使用tkinter创建图形用户界面&#xff08;GUI&#xff09;应用程序&#xff0c;现在我们来介绍另外一个用于创建GUI的神器——pyQt5&#xff0c;它可以用于创建跨平台的桌面应用程序。PyQt5 实现了一个 Python模块集&#xff0c;有 620 个类&#xff0c;60…

乐意购项目前端开发 #1

一、创建vue项目 1. vue create 项目名 2. 运行项目 npm install npm run dev3.使用Git管理项目 创建远程仓库 leyigou 在项目文件终端执行以下代码 git init # git 初始化#这个要使用自己的仓库 git remote add origin gitgitee.com:xie-weijia/leyigou.git # 添加远程仓…

[Docker] 基本名词

镜像(iamge)&#xff1a; Docker 镜像就好比是一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c; 容器&#xff08;container&#xff09;: Docker利用容器技术&#xff0c;独立运行一个或则多个应用&#xff0c;通过镜像来创建的。 启动&#xff0c;停止&a…

docker应用:vocechat

简介&#xff1a;VoceChat是一款超轻量级的Rust聊天应用程序、API和SDK&#xff0c;优先考虑私人托管。使用VoceChat建立您自己的聊天功能&#xff01;作为一款非常好用的通讯应用程序&#xff0c;它可以让你与朋友、家人和同事进行即时消息聊天&#xff0c;支持图片视频的分享…

Linux 压缩与解压缩

参考资料 linux 压缩和解压缩命令gz、tar、zip、bz2tar命令 – 压缩和解压缩文件 目录 一. gzip命令1.1 压缩1.1.1 -k 压缩后保留源文件1.1.2 -l 查看压缩文件中的文件信息1.1.3 -r 递归压缩文件夹中的所有文件 1.2 解压缩 二. zip命令2.1 zip 压缩2.1.1 -r 压缩文件夹2.1.2 压…

温和去油去黑头,只需敷上一刻钟的泥膜就够了

冬季天气干燥&#xff0c;很多朋友脸部更容易出油&#xff0c;连带着黑头也变多了。这是因为干燥的环境会刺激皮脂腺分泌&#xff0c;导致皮肤油脂分泌过多&#xff0c;容易堵塞毛孔形成黑头。因此&#xff0c;在冬季特别需要注意控油去黑头的工作。 控油去黑头需要清洁毛孔&am…

mysql原理--undo日志1

1.事务回滚的需求 我们说过 事务 需要保证 原子性 &#xff0c;也就是事务中的操作要么全部完成&#xff0c;要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况&#xff0c;比如&#xff1a; (1). 事务执行过程中可能遇到各种错误&#xff0c;比如服务器本身的错误&…

并发编程之并发容器

目录 并发容器 CopyOnWriteArrayList 应用场景 常用方法 读多写少场景使用CopyOnWriteArrayList举例 CopyOnWriteArrayList原理 CopyOnWriteArrayList 的缺陷 扩展迭代器fail-fast与fail-safe机制 ConcurrentHashMap 应用场景 常用方法 并发场景下线程安全举例 Con…

第 380 场 LeetCode 周赛题解

A 最大频率元素计数 模拟&#xff1a;先统计元素的频率&#xff0c;然后求由最大频率的元素的总频率 class Solution { public:int maxFrequencyElements(vector<int> &nums) {unordered_map<int, int> cnt;for (auto x: nums)cnt[x];int mx 0, s 0;for (aut…

【如何在 GitHub上面找项目】【转载】

很多的小伙伴&#xff0c;经常会有这样的困惑&#xff0c;我看了很多技术的学习文档、书籍、甚至视频&#xff0c;我想动手实践&#xff0c;于是我打开了GitHub&#xff0c;想找个开源项目&#xff0c;进行学习&#xff0c;获取项目实战经验。这个时候很多小伙伴就会面临这样的…

【Docker篇】使用Docker操作镜像

文章目录 &#x1f6f8;镜像&#x1f33a;基本操作⭐docker --help⭐docker pull [ 参数 ]⭐docker images⭐docker save -- 导出⭐docker rmi -- 删除⭐docker load -- 导入 &#x1f6f8;镜像 镜像是指在计算机领域中&#xff0c;通过复制和创建一个与原始对象相似的副本的过…

mysql原理--undo日志2

1.概述 上一章我们主要唠叨了为什么需要 undo日志 &#xff0c;以及 INSERT 、 DELETE 、 UPDATE 这些会对数据做改动的语句都会产生什么类型的 undo日志 &#xff0c;还有不同类型的 undo日志 的具体格式是什么。本章会继续唠叨这些 undo日志 会被具体写到什么地方&#xff0c…

软件测试|Pydantic详细介绍与基础入门

简介 Pydantic 是一个强大的 Python 库&#xff0c;用于数据验证和解析&#xff0c;特别是用于处理 JSON 数据。它的主要目标是使数据验证和解析变得简单、直观和可维护。本文将介绍 Pydantic 的基础知识&#xff0c;包括如何定义模型、验证数据以及处理错误。 什么是 Pydant…

VMware安装CentOS7虚拟机

VMware 安装 获取 VMware 安装包 下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1ELR5NZa7rO6YVplZ1IUigw?pwdplz3 提取码&#xff1a;plz3 包括&#xff1a;当然&#xff0c;也可以自己去别的地方下载&#xff0c;WMware 版本都差不多&#xff0c;现在用的比…

快速排序学习笔记

代码框架 // 在数组nums将下标从left到right中进行从小到大排序// 原理是先将一个元素排好序&#xff0c;然后将其他的元素排好序void sort(int[] nums, int left, int right) {if (left > right) {return;}// 对数组nums[left,right]进行切分&#xff0c;使得nums[left,p-1…

软件测试|QtDesigner配置以及使用

简介 上一篇文章我们介绍了PyQt5环境的安装和配置&#xff0c;并且安装了Qt tools工具&#xff0c;本文我们将介绍如何使用Qt tools的QtDesigner如何使用。 QtDesigner 的启动和入门 打开我们的项目从顶部菜单栏选择&#xff1a;Tools -> ExternalTools -> QtDesigner…

基于TCP的半双工网络编程实践

首先我们先了解一下什么是半双工通信&#xff1f; 半双工数据传输允许数据在两个方向上传输&#xff0c;但是在某一时刻&#xff0c;只允许数据在一个方向上传输&#xff0c;它实际上是一种切换方向的单工通信。 TCP服务端代码&#xff1a; #include <stdio.h> #inclu…

如何在免费云Colab上使用扩散模型生成图片?

前言 在人工智能技术的迅猛发展下&#xff0c;内容生成领域也迎来了一系列创新的突破。其中&#xff0c;使用扩散模型&#xff08;如Stable Diffusion&#xff09;从文字生成图片的AI技术备受瞩目。这一技术的出现&#xff0c;为我们创造栩栩如生的图像提供了全新的可能性。本…

MongoDB - 库、集合、文档(操作 + 演示 + 注意事项)

目录 一、MongoDB 1.1、简介 a&#xff09;MongoDB 是什么&#xff1f;为什么要使用 MongoDB&#xff1f; b&#xff09;应用场景 c&#xff09;MongoDB 这么强大&#xff0c;是不是可以直接代替 MySQL &#xff1f; d&#xff09;MongoDB 中的一些概念 e&#xff09;Do…

k8s--动态pvc和pv

前情回顾 存储卷&#xff1a; emptyDir 容器内部&#xff0c;随着pod销毁&#xff0c;emptyDir也会消失 不能做数据持久化 hostPath&#xff1a;持久化存储数据 可以和节点上目录做挂载。pod被销毁了数据还在 NFS&#xff1a;一台机器&#xff0c;提供pod内容器所有的挂载点…