hashmap

一篇搞懂HashMap,手写HashMap 手撕HashMap 阅读详情

哈希表就是通过给定的key直接计算一个位置,然后直接去这个位置去寻找对应的数,因为位置是通过计算一次性得到的,而去对应的位置去找(因为内部使用数组进行存储),所以可以直接找到相应的位置,因此存储数据都是O(1)

HashMap.h

#ifndef HASHMAP_H
#define HASHMAP_H

#include <vector>

template<class Key, class Value>
class HashMap  //哈希映射
{
public:
	HashMap(int size = 101) : arr(size)
	{
		currentSize = 0;
	}

	void Put(const Key & k, const Value & v)
	{
		int pos = getArrVal(k);
		arr[pos] = DataEntry(k,v);
		++currentSize;
	}

	Value Get(const Key & k)
	{
		int pos = getArrVal(k);
		//有可能pos处没放数,所以需要判断一下key
		if(arr[pos].key == k)
			return arr[pos].value;
		else
			return Value();
	}

	//通过key计算一个唯一的hashVal
	unsigned int getHashVal(const Key & k) const
	{
		unsigned int hashVal = 0;
		const char *keyp = reinterpret_cast<const char *>(&k);
		for(size_t i=0; i<sizeof(Key); i++)
			hashVal = 37 * hashVal + keyp[i];
		return hashVal;
	}

	//将key映射到数组中,由于key很大,数组很小,所以需要进行映射
	int getArrVal(const Key & k) const
	{
		unsigned hashVal = getHashVal(k);
		hashVal %= arr.size();
		return hashVal;
	}
private:
	struct DataEntry{
		Key key;
		Value value;

		DataEntry(const Key & k = Key(),const Value & v = Value()):key(k),value(v){}
	};
	std::vector<DataEntry> arr;
	int currentSize;
};

#endif

LinearMap.h

#ifndef LINEARMAP_H
#define LINEARMAP_H

#include <vector>

template<class Key, class Value>
class LinearMap  
{
public:
	LinearMap(int size = 101) : arr(size)
	{
		currentSize = 0;
	}

	void Put(const Key & k, const Value & v)
	{
		arr[currentSize] = DataEntry(k,v);
		++currentSize;
	}

	Value Get(const Key & k)
	{
		//线性查找
		for(size_t i=0; i<currentSize; ++i)
		{
			if(arr[i].key == k)
				return arr[i].value;
		}
		return Value();
	}
private:
	struct DataEntry{
		Key key;
		Value value;

		DataEntry(const Key & k = Key(),const Value & v = Value()):key(k),value(v){}
	};
	std::vector<DataEntry> arr;
	int currentSize;
};

#endif

main.cpp

#include <iostream>
#include <map> //映射(也叫字典),二叉树映射,不是哈希映射
#include <string>
#include "LinearMap.h"
#include "HashMap.h"

using namespace std;

int main()
{
	cout << "二叉树(红黑树)映射: " << endl;
	map<string,int> m;
	m["Bill"] = 98;
	m["Tom"] = 67;
	m["Mary"] = 100;
	//...继续保存,保存了很多, 100万个,1000万个!

	cout << m["Tom"]  << endl;

	//一个没用的,只仅学习的线性映射
	LinearMap<string,int> lm;
	lm.Put("Bill",99);
	lm.Put("Tom",88);
	lm.Put("Mary",77);
	//继续put很多数据,100万个
	cout << "LinearMap: " << lm.Get("Tom") << endl;

	//我的哈希映射
	cout << "我的哈希映射: " << endl;
	HashMap<string,int> myHMap;

	myHMap.Put("Bill",999);
	myHMap.Put("Tom",888);
	myHMap.Put("Mary",777);
	cout << myHMap.Get("Tom") << endl;
	
	system("pause");
	return 0;
}
c++实现一个快速哈希映射和哈希集使用robin hood哈希- Tessil/robin-map c++实现一个快速哈希映射和哈希集使用robin hood哈希- Tessil/robin-map-源码 立即下载

相关推荐

一个内存高效哈希映射和哈希集的c++实现- Tessil/sparse-map

一个内存高效哈希映射和哈希集的c++实现- Tessil/sparse-map-源码

我的技术贴

这是我的个人记录

lining1718的博客 343

Windows下玩转Spark:零基础本地集群搭建与实战演示

本文详细介绍了在Windows系统下零基础搭建Spark本地集群的完整流程,包括环境准备、集群启动、实战案例演示及性能优化技巧。通过Standalone模式快速部署,结合WordCount等经典案例帮助初学者快速掌握Spark数据处理,特别适合Windows环境下的大数据开发入门学习。

weixin_33734785的博客 424

Hash 一致性算法

应用在 数据库分库 等领域: 如果我们采用取余 或者 普通hash的话. 再一次增加一台机器的过程中, 会导致大面积数据迁移问题.要不然就会出现入库不平均. consistent hashing 就是为了解决这个问题的. 初始分配: 将所有机器通过hash算法分布在一个2^32次方的一个圆环上. 当每一次入库的时候.都会根据has

robin622的专栏 640

Ubuntu20.04下Pycharm的快速安装与配置指南

本文提供了一份详细的Ubuntu 20.04系统下PyCharm社区版的安装与配置指南。文章重点介绍了通过手动下载.tar.gz压缩包进行安装的灵活方法,并涵盖了系统准备、依赖安装、首次运行、创建快捷方式以及解释器配置等关键步骤,帮助Python开发者快速搭建高效、可控的本地开发环境。

weixin_28831341的博客 379

电磁波函数复数表示法:为什么物理学家偏爱e^(ikz)而非cos(kr-wt)?

本文深入解析了电磁波函数复数表示法(如e^(ikz))相较于传统余弦形式的巨大优势。通过欧拉公式,复数形式将复杂的三角运算转化为简洁的指数运算,在微分、积分、线性叠加及处理相位时展现出极高的计算效率,是物理学家和工程师分析波动现象的核心工具。

weixin_29094539的博客 498

c++ map 查找性能测试

最近在为推荐服务作性能调优,这个服务的主要逻辑是用离线计算的模型数据给请求中的每个广告打分,再返回这些广告的排序结果,这里面打分的过程其实就用请求中的数据拼成各种key,去查一个大的 map,这种计算非常多,成为了主要的性能瓶颈,代码比较老,使用的是 boost::unordered_map,为了解决这个问题,找了一些第三方库和标准库对比...

weixin_34082854的博客 1008

解决RK3566 USB OTG模式识别问题:从原理图分析到otg_mode文件操作全解析

本文深入解析RK3566 USB OTG模式识别问题,从硬件原理图设计到Linux内核的otg_mode文件操作,提供全面的调试方案。针对USB_OTG0_ID引脚电路设计、电源管理关联及内核驱动交互等关键点,给出实战调试技巧和常见问题解决方案,帮助开发者高效解决USB OTG模式切换难题。

eee77的博客 866

C++ 浅谈Robin Hood Hash 算法

探测距离远的元素 = 穷人探测距离短的元素 = 富人插入时发现某位置被占:如果新元素比桶里元素 更穷(探测距离更远),就 抢占 位置,把老元素 往后挤。贫富差距变小(探测距离差距减小)查找操作平均探测次数变少最坏情况比普通线性探测更好Robin Hood 探测通过“让探测距离大的元素优先占位”的方式,有效抑制了哈希表中因聚集造成的长尾探测链,提升了在高负载场景下的平均与最坏查找性能。

xiaofeng的博客 1318

电力抄表协议DL/T645和698.45到底有啥区别?一张图帮你选对协议

本文深入对比了电力抄表协议DL/T645和DL/T698.45的技术差异,从协议架构、报文结构、功能覆盖到实施成本进行全面分析。通过实际案例和数据,揭示698.45协议在通信效率、业务扩展性和长期成本上的优势,并提供清晰的选型决策流程图,帮助工程师根据具体需求选择最适合的电力抄表协议。

weixin_38168696的博客 401

Navicat Premium 12 永久激活保姆级教程(附最新补丁下载)

本文详细介绍了Navicat Premium 12的高效使用方法,从安装配置到高级功能应用,帮助用户充分发挥这款数据库管理工具的全部潜力。内容包括数据库连接管理、数据查询与编辑、数据同步与结构对比等核心功能,以及性能优化和最佳实践建议,提升数据库管理效率。

weixin_28834765的博客 642

什么是HashMap?什么情况下使用HashMap?

这里是修真院后端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析后端知识/技能,本篇分享的是: 【什么是HashMap?什么情况下使用HashMap?】 大家好,我是IT修真院深圳分院第十一期学员,一枚正直纯洁善良的JAVA程序员。 今天给大家分享一下,修真院官网JAVA任务十的一个知识点:什么是...

IT修真院:初学者转行到互联网的聚集地 7635

【Claude Code 源码解析教程】总体大纲

本教程旨在深入解析 Anthropic Claude Code 项目的源码架构和实现细节。Claude Code 是一个基于 TypeScript + Bun 构建的 AI 编程助手 CLI 工具,代号 "Tengu",具有复杂的多模块架构和丰富的功能特性。本教程基于Claude Code 的源码分析来生成,将帮助您全面掌握 Claude Code 的源码架构和实现细节,为开发类似 AI 编程助手工具奠定坚实基础。

rengang66的博客 386

HashMap相关面试题(哈希表、HashMap的实现原理、HashMap的put方法的具体流程、HashMap的扩容机制、HashMap的寻址算法)

HashMap相关面试题(哈希表、HashMap的实现原理、HashMap的put方法的具体流程、HashMap的扩容机制、HashMap的寻址算法)

聂可以的博客 2244

YOLOv8【第四章:注意力机制篇·第20节】一文讲透,注意力机制设计原则与选择指南 - 从原理到实践的系统化方法论!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读!

**My Coding Family** 896

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【HashMap】

HashMap简单概括

weixin_52553065的博客 2086

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

详解 HashMap扩容机制,HashMap的底层原理以及HashSet在底层原理

利用HashCode方法和equals方法HashCode方法来计算出哈希值,根据哈希值计算机出要元素要存入的位置,然后再调用equals方法比较对象内部的属性值是否一样利用什么机制保证去重?**利用HashCode方法和equals方法HashCode方法来计算出哈希值,根据哈希值计算机出要元素要存入的位置,然后再调用equals方法比较对象内部的属性值是否一样。

Java技术加油站的博客 2105

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HashMap详解

本文主要介绍了Java集合框架中HashMap的相关知识,包括源码分析、hash 原理、扩容机制、加载因子、线程不安全等内容。

专注Java和MySQL领域知识分享 1684

HashMap深入讲解

摘要: HashMap是Java中基于哈希表的Map实现类,允许null键值且不保证顺序。其底层采用数组+链表/红黑树结构,默认容量16,负载因子0.75(平衡空间与时间效率)。HashSet实际通过HashMap实现。关键特性包括:key需重写equals()和hashCode(),value需重写equals();当链表长度>8且数组容量≥64时转为红黑树。put操作先计算key的hash值(通过hashCode()高16位异或),再处理哈希冲突。构造方法可自定义初始容量和负载因子。

1355

JAVA之HashMap详解

HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null,此外,HashMap 中的映射不是有序的。jdk1.8 之前 HashMap 由数组 + 链表组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突(两个对象调用的 hashCode 方法计算的哈希值经哈希函数算出来的地址被别的元素占用)而存在的(“拉链法”解决冲突)。

励志成为一名优秀的全能型软件开发工程师。 2328

面试手写HashMap,手撕HashMap

前言: 现在面试时,面试官经常会问到HashMap,简单点就会问下HashMap的一些关键知识点,困难些的可能会当场让你手写一个HashMap,考察下你对HashMap底层原理的了解深度;所以,今天特别手写了一个简单的HashMap,只实现了 put、get、containsKey、keySet 方法的 HashMap,来帮助我们理解HashMap的底层设计原理。 本文...

木子雷的博客 2220

HashMap原理

HashMap是基于哈希表的键值对存储结构,采用数组+链表+红黑树解决哈希冲突。核心通过键的hashCode计算哈希值,使用(n-1)&hash确定数组索引位置。默认容量16,负载因子0.75,超过阈值会扩容2倍。Java8优化了哈希扰动函数,将高16位与低16位异或,使分布更均匀。当链表长度超过8且数组容量≥64时,链表转为红黑树;节点数低于6时转回链表。put方法先检查桶是否为空,为空则直接插入;否则处理冲突,匹配则更新,不匹配则链式存储或树化。

猫狗鼠鱼的储物间 1096

HashMap 详解

本文深入解析Java中HashMap的核心特性、底层数据结构及哈希冲突处理机制,涵盖自定义类型作为key的处理、手写HashMap实现及Java8后的优化,通过源码分析揭示哈希表扩容与性能优化策略,助你掌握高效数据管理与操作技巧。

m0_73941339的博客 1423

Java HashMap

HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。如果你只想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,如果你只想获取 value,可以使用 values() 方法。对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hashMap 中。

2401_88984449的博客 1101

HashMap

如果这和个位置上有多个元素,还需要用key的equals方法在对应位置的链表中找到需要的元素,通常equals方法一般都会根据实际的业务内容来定义。这里适用位运算,所以上面的capacity要是2的次方,因为2的次方减1得到一个全1的二进制数,做and操作就会保证索引的均匀性,否则加入某一位是0,那么这一位就永远不会在索引中出现。如果key为null,会存放在索引为0的entry,但是这个entry不一定只有key为null的value,所以需要遍历所有的entry,返回key为null的value。

weixin_43991255的博客 862
上一篇: 大顶堆
下一篇: 二叉搜索树
菜鸟方圆圆
博客等级 码龄10年 26粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值