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

【数据结构】哈希表(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

哈希查找算法

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

[终于解决]Ubuntu14.04 32位安装移动网卡(0bda:b711)驱动8188gu tplink-WN726n

大致梳理一下问题解决的流程 首先,在台式机做了双系统,台式机只有一个网线接口,由于项目要求,需要占用网口传输数据,所以用之前买的tplink-WN726n免驱版2.0的移动网卡 【note】免驱版只能在Windows下安装使用,在Ubuntu系统中无法使用,所以,需要另辟蹊径。 找了很多资料,尝试很多方法,有的复杂有的简单,终于解决。 【思路】首先在Ubuntu系统中输入lsusb,查看是否检测到USB网卡设备。然后从Github中复制代码,构建,安装,然后modprobe一下,到前面那步还不行,就再来一步

瑞o 1万+

恋上数据结构与算法:哈希表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

使用LogisticRegression和LightGBM模型对信贷违约进行预测----基于kaggle比赛数据

3.分离数值型变量与类别型变量,发现有些数值型变量因为输入不规范,比如数值中含有字符(28_,_10000_等)被划分为类别型变量 ,比如 'Age','Annual_Income','Num_of_Loan', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit','Credit_Mix','Monthly_Balance', 'Outstanding_Debt' ,'Amount_invested_monthly'等。三、分箱,woe编码,计算IV值。

I_am_a_big_tiger的博客 1682

数据结构——哈希表

hash table

u014374826的博客 4745

[Linux项目实践] LCD Panel的硬件分析及调试

LCD硬件分析 项目使用3.5” TFT-LCD并且支持触摸控制。LCD的硬件可从几个方面学习:1)查看LCD的硬件连线。2)查看数据手册了解寄存器的控制。3)查看LCD DATASHEET了解硬件操作 1)LCD硬件连线 在图中有33个引脚,22根数据引脚和9根控制引脚。 LCD的工作原理:像素点是从左至右,从上至下逐个显示,LCD控制寄存器会从从内存中的framebuffer通

Terry_Yuan的技术专栏 3022

从代码层面分析STM32 标准库和HAL库的差异

相当于每个设置都是独立的函数。HAL库将一段代码通过宏定义的方式封装成了一个函数,每个端口的时钟都单独的定义了一个名称,标准库是一个独立的函数,通过参数传递的方式来设置每个端口的时钟。这两个版本的函数本质上操作的还是寄存器,不过HAL库操作的只是BSRR寄存器,而标准库端口置1的时候操作的是BSRR寄存器,端口清0的时候操作的是BRR寄存器。标准库设置端口模式的时候,是在if语句中判断之后直接设置的,而HAL端口模式设置时,却使用了switch语句去设置,说明在HAL库中,端口模式和标准库中发生了改变。

HXYDJ的博客 2万+

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

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

阿星小天地 182

深入解析BlueZ5与D-Bus:Linux蓝牙开发实战指南

本文深入解析BlueZ5与D-Bus在Linux蓝牙开发中的核心应用,提供从环境搭建到实战开发的完整指南。通过详细代码示例和调试技巧,帮助开发者掌握蓝牙协议栈与D-Bus接口的交互方法,实现高效蓝牙设备管理与GATT服务开发。

weixin_28292761的博客 449

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

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

Pausch的博客 352

用 SAML 2.0 Bearer Assertion 配置 ABAP OAuth 2.0 令牌交换

摘要: SAP系统集成中,身份跨系统传递是关键挑战。OAuth 2.0的SAML 2.0 Bearer Assertion grant机制通过SAML断言换取访问令牌,实现安全身份传递。配置核心在ABAP的SOAUTH2事务码,需绑定可信SAML身份提供商(IdP)并指定访问范围。实际应用中,需确保SSL加密传输,正确配置SAML IdP信任关系,并为OAuth客户端分配专用系统用户。常见问题包括证书不匹配、权限配置不当等,需分层控制权限边界以保障安全。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 834

Arduino开发实例-EMG 肌肉信号传感器

在医学研究中,测量肌肉的活动、收缩和扩张非常重要。 EMG 肌肉传感器测量肌肉活动并产生信号以显示扩张和收缩量。 因此,输出取决于所选肌肉的活动量。 3 绿色、红色和黄色电极连接到模块,用于传输来自肌肉运动的电信号。

视觉与物联智能 1694

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

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

算法萌新一枚 4295

5实践报告撰写

一 项目流程 明确标准 确定分析目标 寻找分析数据 清洗数据 描述性分析 诊断性分析 提出建议 撰写报告 二 确定分析目标 什么是你感兴趣的? 什么是你熟悉的? 什么是你擅长的? 1 电商零售行业 商品销量分析 价格分析 评价分析 ...... 2 自媒体行业 广告投放力度分析 广告投放回报分析 不同类型的产品分析 ...... 3 金融行业 股票价格分析 信贷业务违约分析 客户画像分析 ...... ...

waywardG的博客 2830

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

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

祯的博客 1619

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

高效实现LRU缓存算法

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

2301_77749840的博客 466

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【c++】哈希表实现

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

2401_88230254的博客 572

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

每日算法一练:剑指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、付费专栏及课程。

余额充值