哈希表思路分析及代码实现

【数据结构】哈希表(6000字超详细) 哈希表概念:哈希表是构造出来的一种可以快速查找的存储结构。哈希存储的基本思想是以关键字为自变量,通过一定的函数关系(称为散列函数或者哈希函数),计算出对应的函数值,以这个值作为数据元素的地址,将该数据元素存到相应的地址单元中去。查找时,再根据关键字采用计算哈希值的方式计算出相应的哈希地址,再到相应的存储单元去取需要的元素即可。在顺序结构和平衡树中,元素关键码与它的存储位置之间没有对应映射关系,在查找时需要多次比较,而哈希表可以通过哈希函数建立元素关键码与存储位置之间的对应关系。 阅读详情

哈希表

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

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

哈希表的基本介绍

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

代码实现

package com.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("name=");
				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;
		// 初始化empLinkedListArray
		empLinkedListArray = 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);
	}
	// 遍历所有的链表,遍历hashTab
	public 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", (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;// 默认为空null

	public Emp(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
}
// 创建EmpLinkedList,表示链表
class EmpLinkedList {
	// 头指针,执行第一个Emp,因此我们这个链表的head是直接指向第一个Emp的
	private Emp head;// 默认为空
	// 添加雇员到链表
	// 说明:
	// 1.假定添加雇员是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 没有找到返回null
	public Emp findEmpById(int id) {
		// 判断链表是否为空
		if (head == null) {
			System.out.println("链表为空");
			return null;
		}
		// 辅助指针 curEmp
		Emp curEmp = head;
		while (true) {
			if (curEmp.id == id) {// 找到
				break;// 这时curEmp就指向要查找的雇员
			}
			// 退出
			if (curEmp.next == null) {// 说明没有找到改雇员
				curEmp = null;
				break;
			}
			curEmp = curEmp.next;// 以后
		}
		return curEmp;
	}
}
用链接法实现散列表构造和查找 用链接法实现散列表的构造和查找 使用语言:C++ 阅读详情

相关推荐

哈希表面试常见问题

本文摘要: 本文系统讲解了哈希表的核心应用与实现,包括5大经典问题解决方案: LRU缓存实现 - 哈希表+双向链表组合,O(1)时间完成查找和淘汰 两数之和查找 - 哈希表记录遍历过程,空间换时间优化至O(n) 重复字符检测 - 集合实现高效查找,时间复杂度O(n) 频率统计 - 字典记录元素出现次数,单次遍历完成统计 线程安全设计 - 锁机制保证并发安全,避免数据竞争 关键技术点包括: 数据结构组合应用(如哈希表+链表) 空间换时间优化策略 并发控制原理 哈希冲突解决方案对比 动态扩容机制分析 每个方案均

2401_87975790的博客 800

数据结构:哈希表设计(c++)

文章目录一、实验题目二、需求分析三、概要设计四、调试分析五、使用说明六、测试结果七、其他数据结构实例 一、实验题目 根据数据结构知识,设计哈希表的相关内容 二、需求分析 [问题描述] 针对某个集体中人名设计一个哈希表,使得平均查找长度不超过 R,并完成相应的建表 和查表程序。 [基本要求] 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有 30 个,取平均查找 长度的上限为 2。哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。 [测试数据] 取读者周围较熟悉的 30 个人名。 [选

pengmingjv的博客 3319

【华为OD机考真题】- 斗地主(B卷-100分)(Python版)

🔔本文收录于「最新最全华为OD机试真题(Python版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!本人所写题库均精心搜集于互联网。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!

**My Coding Family** 1882

二十四、哈希表的原理分析及代码实现

一、哈希表的基本介绍 散列表(Hash table,也叫哈希表),是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表。 二、哈希表的实际需求 1.有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的 id 时, 要求查找到该员工的 所有信息. 不使用数据库,速度越快越好=>哈希表(散列) 添加时,保证按

zhaozhiwei314的博客 249

哈希查找算法

哈希函数的构造方法常用:数字分析法、平均取中法、分段叠加、伪随机数法、余数法;构造好的哈希函数可以减少冲突。

YOLO11实战:手把手教你优化钢材表面缺陷识别模型(基于NEU-DET数据集)

本文详细介绍了如何使用YOLO11优化钢材表面缺陷识别模型,基于NEU-DET数据集进行实战训练。从数据增强、模型架构优化到训练过程控制,全面解析提升钢材缺陷检测性能的关键技术,特别针对裂纹、划痕等典型缺陷提出针对性解决方案。

weixin_29081163的博客 377

恋上数据结构与算法:哈希表01(二十一)

文章目录 (一)TreeMap的分析 (二)需求分析 (三)哈希表(Hash Table):简介 (四)哈希表(Hash Table):哈希冲突(Hash Collision) (五)哈希表(Hash Table):JDK8的哈希冲突解决 (六)哈希表(Hash Table):哈希函数 (七)哈希表(Hash Table):哈希值的计算(int & float) (八)哈希表(Hash Table):哈希值的计算(long & double) (九)哈希表(Hash Table):哈希值的计

zzq的博客 610

GBase8a-GDCA认证考试-复习参考题

为提升产品服务水平定期举办GBase产品认证培训,培训更多GBase数据库专业人员,满足用户快速成长的业务需求,建设GBase产品生态。请注意甄别,根据所学知识综合判断,正确率97%(97分)。

weixin_41826637的博客 2369

数据结构——哈希表

hash table

u014374826的博客 4745

ArcGIS拓扑检查实战:5分钟搞定面重叠与缝隙问题(附详细截图)

本文详细介绍了如何使用ArcGIS进行拓扑检查,快速解决面重叠与缝隙问题。通过搭建拓扑检查环境、配置拓扑规则、五步闪电修复法及批量处理技巧,帮助用户高效完成数据修正,提升GIS数据质量。特别适合地籍管理、规划红线等场景应用。

z4a5b6的博客 741

Deep Reinforcement Learning - 1. DDPG原理和算法

Deep Reinforcement Learning - 1. DDPG原理和算法 背景描述 DDPG的定义和应用场景 DDPG算法相关基本概念定义 DDPG实现框架和算法 DDPG对于DPG的关键改进 下一篇 以下用RL作为Reinforcement Learning 的简称。背景描述概括来说,RL要解决的问

kenneth_yu的博客 14万+

JAVA数据结构与算法:哈希表、思路分析、代码实现

哈希表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 1、关于哈希表的题 有一个公司,当有新的员工来报道时,要求将该员工信息加入(id,姓名,年龄),当输入该员工的id时,要求找到该员工的所有信息。 要求:不使用数据库,速度越快越好。 . 思路分析 有3个类: EmpHashTable类:根据id散列每个存入的值;创建

阿星小天地 182

从采集到播放:RV1106+H264全链路开发避坑指南(含FFmpeg转码技巧)

本文详细解析了基于Rockchip RV1106芯片构建H.264视频从采集到播放全链路的开发实践。内容涵盖RKMPI框架设计、VI/VENC模块配置、内存泄漏排查及FFmpeg高效转码技巧,旨在帮助嵌入式开发者规避常见陷阱,实现稳定高效的低延迟视频处理流水线。

weixin_29189377的博客 661

Java——数据结构与算法(哈希表)思路图解分析 代码实现

哈希表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址.),当输入该员工的id时, 要求查找到该员工的所有信息 要求: 1)不使用数据库…速度越快越好=>哈希表(散列) 2)添加时,保证按照id 从低到高插入[课后思考: 如果i

Pausch的博客 352

Codex本地部署指南:从环境配置到API集成实战

Codex作为OpenAI推出的代码生成模型,能够根据自然语言描述自动生成代码片段,大幅提升开发效率。这次我们重点分析Codex的本地部署方案、硬件门槛、接口调用方式和实际使用效果,帮助开发者判断是否值得投入时间部署。 从技术架构看,Codex基于GPT-3模型微调,专门针对代码生成任务优化。最新版本支持多种编程语言,包括Python、JavaScript、Java、C++等主流语言。对于国内开发者来说,最关心的是能否在本地环境稳定运行,以及是否需要特殊网络配置。 1. 核心能力速览 能力项 技术说明 模型

weixin_33309048的博客 522

【BUG已解决】ImportError: cannot import name ‘OpenAI‘ from ‘openai‘ 解决方案

的核心是版本不匹配用确认当前版本如果是 0.x 版本 →升级到 1.x升级后代码语法要同步改为团队协作项目务必在中锁定版本号,避免"我这能跑,你那不能跑"的问题对接国产模型时,只需替换base_url参数,SDK 调用方式完全一致。

一键难忘的博客 1万+

Java数据结构-哈希表的实现(hash)

我想给大家介绍的是哈希表,当我们学集合的时候一定会接触到hashtable,我们却不明白为什么要同时重写equals方法和hashCode方法,今天,我就带大家了解哈希表底层,让大家彻底弄懂哈希表.哈希表的概述 🔜 哈希表的创建思路🔜 哈希表的代码实现与分析🔜 结论

算法萌新一枚 4295

huggingface高速下载模型的实战代码

本文主要介绍了huggingface高速下载模型的实战代码,尤其是无法通过国内源进行下载的huggingface模型,希望能对学习大模型的同学们有所帮助。需要特别说明的是,本文的代码是完全原创的,即能够最大限度利用宽度的速度,而且还能实现断点续传。 文章目录 1. 背景 2. 实战代码

herosunly的博客 29万+

哈希表(典型算法思想)—— OJ例题算法解析思路

哈希表(典型算法思想)—— OJ例题算法解析思路

祯的博客 1619

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

高效实现LRU缓存算法

本文介绍了如何实现一个高效的LRU缓存数据结构。通过结合哈希表(O(1)查找)和双向链表(维护访问顺序),实现了在O(1)时间内完成get和put操作。当缓存满时,移除链表尾部的最久未使用节点。具体实现包括:双向链表节点类、辅助方法(添加/移除节点、移动节点到头部等),以及核心的get/put逻辑。get操作查找值并更新访问顺序,put操作更新或插入节点,必要时淘汰旧数据。该设计确保了高效性(O(1)时间)和合理性(O(capacity)空间),适用于需要快速访问缓存的场景。

2301_77749840的博客 466

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【c++】哈希表实现

如果是2^x ,那么key %2^x本质相当于保留key的后X位,那么后x位相同的值,计算出的哈希值都是⼀样的,就冲突了。当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加⼀个仿函数,这个仿函数⽀持把key转换成⼀个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就⽤默认参数即可,如果这个Key不能转换为整形,我们就需要⾃⼰实现⼀个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。

2401_88230254的博客 572

每日算法一练:剑指offer——字符串篇(2)

这样一来,在统计字符频率后,可以直接遍历有序的哈希表来查找第一个只出现一次的字符,避免再次遍历整个字符串,从而提高效率。因为连续且最长的招式序列是 "dbascD" 或 "bascDd",所以其长度为 6。,因为字符集限制为小写字母,最多只有 26 个不同字符,哈希表所需的额外空间是固定的。遍历字符串一次构建有序哈希表,遍历哈希表一次找出第一个只出现一次的字符。记录每个字符上一次出现的位置,以便快速查找重复字符的位置。)的实现可以优化查找首个只出现一次的字符,因为。上次出现的位置的后面,确保子串无重复。

m0_53926113的博客 889

常见哈希表相关题目

LeetCode中相关哈希表的题目

我要学编程的博客 1223

京东高频编程考题:和为 K 的子数组 (中等)

具体可参考:https://zyfcodes.blog.youkuaiyun.com/article/details/141401712。我们只遍历一次数组,每次操作的时间复杂度是 O(1),因此总的时间复杂度是 O(n)。前缀和的基本思想是通过累积数组元素的和,可以快速计算出任意子数组的和。要解决这个问题,我们可以使用前缀和(Prefix Sum)以及哈希表来优化查找和为。个不同的前缀和,因此空间复杂度是 O(n)。在最坏的情况下,哈希表。子数组是数组中元素的连续非空序列。

LLN98765的博客 1166

哈希表

哈希表的基本介绍 哈希表流程图 哈希表(散列)——Google上机题 哈希表管理雇员思路分析 代码 表示一个雇员 package com.hashtab; public class HashTabDemo { public static void main(String[] args) { } } //表示一个雇员 class Emp{ public int i...

fishermanMr 215

两数相加——哈希表算法

每日力扣刷题总结前言一、两数相加题意示例题目解析官方题解二、使用步骤1.引入库2.读入数据总结功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这

qq_46674698的博客 919
上一篇: 斐波那契查找(黄金分割法查找)思路分析及代码实现
下一篇: 二叉树删除结点思路分析及代码实现
lu_long
博客等级 码龄8年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值