哈希表使用总结

刷题日记

最近完成哈希表的算法题练习,对哈希表的使用场景有了进一步的深入。

哈希表简介

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。
	也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
	这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,
	则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
  • 以上来自百度百科的介绍,
  • 简单来说,哈希表和散列表是一个东西,都是根据关键码的值直接进行访问的数据结构。
  • 举个栗子,数组其实就是一个哈希表,通过数组角标(关键码的值)直接进行访问的数据结构

常见哈希表

  • 常见的哈希表,这里就说一下我到现在用的比较多的3种哈希表,
  • 分别是:数组、set集合、map集合
    小声bb,因为我是资深的java的萌新,其他语言有没有set和map就不清楚了,不过语言之间是相通的啦,应是有类似的数据结构的啦~
  • 数组相信大家都很熟,这里就简单介绍一下set和map的特性,
  • set:集合内元素:不可以重复,无序
  • map:map是双列集合,存储的是键值对,保证键的唯一性

使用场景

0. 大体上

  • 哈希表的使用场景,从定义上来看(百度百科上说的可能比较清楚),是一种花费空间来换取时间的数据结构,所以当我们需要快速判断一个元素是否出现在集合内的时候就可以考虑使用哈希表来帮助我们

常用哈希表种类的选择

  • 根据俺这几天的学习经验,以上三种哈希表使用的场景还是大有不同滴~。
    在这里插入图片描述

1. 数组

  • 数组作为哈希表来使用的话,有两个地方需要注意,一个是哈希函数,一个是空间
  • 所以,这个哈希函数是个啥嘞?
    在这里插入图片描述
1.1 哈希函数
哈希函数指将哈希表中元素的关键键值映射为元素存储位置的函数。
	一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,
	因此,在结构中查找记录时需进行一系列和关键字的比较。
这一类查找方法建立在“比较“的基础上,查找的效率依赖于查找过程中所进行的比较次数。
	理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,
	使每个关键字和结构中一个唯一的存储位置相对应。
  • 以上是百度百科的定义
  • 简单来说,哈希函数就是一个映射关系,就比如你要把你同班同学的名字映射到哈希表上的索引,然后就可以通过查询索引下标来找到你班上的某某某,如下图:
    在这里插入图片描述
  • 通过哈希函数将要存放的数据与哈希表的索引下标形成关联。

  • 咳咳,回到数组上来
  • 既然选择数组作为哈希表,那么首先要解决的就是映射问题
  • 在力扣的242.有效的字母异位词中就可以使用数组作为哈希表,映射关系也是巧妙的利用题中的提示:两字符串中仅包含小写字母,通过char与int数据类型之间的关系,利用ASCII码,
  • 将 (字符 - ‘a’) 作为哈希函数,实现char到哈希表索引的转换,这也是经常使用的映射手段之一,
  • 基本上碰到字母就有点暗示使用数组的味道在里面了。

1.2 空间
  • 再来就是空间的考量了,
  • 数组的大小是受限的,
  • 也就是说,1. 如果我们在无法确定需要存放数据的数量的时候;2. 很难将目标映射满数组的时候,或者说如果数组空间够大,但哈希值比较少、特别分散、跨度非常大(会造成空间的浪费),是不适合使用数组作为哈希表的。

2. set和map

  • 需要使用set(集合)和map(映射)的时候主要是考虑到这两种东东的特性,再来就是处理速度
  • 一般来说能用数组的就用数组,不能用才会考虑这以上两位
  • 因为后面两者占用空间,在同等情况下要比数组打,而且速度不如数组,
  • set把数值映射到key上都要做hash计算的,map也需要做相应的hash函数运算,在数据量比较大的情况下,会有很大的时间差异的!!
2.1 set
  • set主打的就是元素的唯一性,当有需要限定查找集合中的元素不能重复的时候,我们就应该考虑使用set集合了,
  • set在各大语言中也有一些细分,像java就有HashSet和TreeSet,代表着无排序需求的和有排序需求的,其他语言也有诸如此类的东西存在,这里就不做过多介绍
2.2 map
  • map使用的场景,无非是前面两个兄弟用不了,这里就一口气把他们的缺点bb一下
  • 数组大小受限制,如果元素很少,而哈希值又比较大会造成内存空间的浪费
  • set集合里面能放的元素只有一个key,而不能记录其他信息,就比如有一些题目不仅需要记录元素本身,还需要记录该元素出现的次数,这个时候set就分身乏术了
  • 而map是以键值对的形式存储的,所以可以在记录元素本身的时候,还能记录与元素相关的其他信息
  • 啊!map这么牛,还要他们两啥事啊?以后做题都用map不就完事了。好嘛通关秘籍+1·。
    在这里插入图片描述
  • 确实map可以适用大多数情况,但是使用map的空间消耗要比数组大一些,因为map要维护红黑树或者符号表(map内部的实现底层,这里就不多说了,感兴趣的小伙伴可以去了解一下),而且还要做哈希函数的运算。所以能用数组用数组嘛,不能使再看需求选择其他俩哥么就行了

总结

  • 虽然map是万能的,但是却不见得是最优的,根据切实需要,选择set和数组,才是一个资深菜姬该有的风度和浪漫~
  • 最后祝还在努力的小伙伴们都能去到自己想去的地方,拿到自己想要的offer,既然都看到最后了,还麻烦高抬贵手点个赞(* ̄︶ ̄)~

在这里插入图片描述

<think>嗯,用户想要了解易语言中哈希表使用教程。首先,我得确认易语言是否支持哈希表这种数据结构。根据我的记忆,易语言的标准库可能没有直接的哈希表实现,但通常可以通过其他方式模拟,比如使用自定义数据类型或者结合其他组件。 然后,我需要考虑用户可能的背景。使用易语言的开发者可能更习惯中文编程环境,所以应该用他们熟悉的术语和例子。可能需要分步骤讲解如何创建类似哈希表的结构,比如使用数组、索引或者结合其他组件如“哈希表”支持库或模块。 接下来,我应该检查是否有第三方模块或支持库可以提供哈希表功能。比如,网上可能有用户开发的模块,如“E2EE”或“精易模块”,里面可能包含哈希表的实现。需要提到这些资源,并说明如何获取和使用它们。 另外,用户可能需要具体的代码示例。例如,如何使用数组和索引来模拟键值对,或者如何调用模块中的方法。要确保示例简单明了,符合易语言的语法习惯,比如使用中文变量名和函数名。 还要注意易语言本身的特性,比如其事件驱动和可视化编程,可能在处理数据结构时需要特定的方法。需要提醒用户在使用第三方模块时注意兼容性和稳定性问题,建议测试和备份。 最后,总结一下步骤:确认需求,讲解基础概念,介绍实现方法(包括内置方法和第三方模块),提供代码示例,注意事项。确保回答结构清晰,逐步引导用户解决问题。</think>易语言哈希表使用教程(基于核心支持库+第三方模块方案) 一、基础概念 1. 哈希表特点:键值对存储结构,通过键(key)快速查找值(value) 2. 时间复杂度:理想情况下查找效率为O(1) 3. 适用场景:需要快速存取/修改数据的场景,如配置项管理、缓存系统等 二、基础实现方法(使用核心支持库) 1. 自定义数据类型法: ```easycode .数据类型 键值对 .成员 键,文本型 .成员 值,通用型 .局部变量 哈希表,键值对,数组,0 ``` 2. 添加元素示例: ```easycode 重定义数组(哈希表, 真, 取数组成员数(哈希表) + 1) 哈希表[取数组成员数(哈希表)].键 = "userName" 哈希表[取数组成员数(哈希表)].值 = "张三" ``` 3. 查找元素函数: ```easycode .函数 查找值,通用型 .参数 目标键,文本型 .局部变量 i,整数型 .计次循环首(取数组成员数(哈希表), i) .如果真(哈希表[i].键 == 目标键) 返回(哈希表[i].值) .如果真结束 .计次循环尾() 返回(空) ``` 三、高效实现方案(推荐使用第三方模块) 1. 推荐模块: - 精易模块(v10.x+):提供`类_哈希表` - E2EE支持库:提供更专业的哈希表实现 2. 精易模块使用示例: ```easycode .局部变量 哈希表,类_哈希表 ' 初始化 哈希表.创建() ' 添加数据 哈希表.置值("age", 25) 哈希表.置值("score", 98.5) ' 获取数据 .局部变量 结果,整数型 结果 = 哈希表.取值整数("age") ' 删除数据 哈希表.删除("score") ' 遍历示例 .局部变量 键数组,文本型,数组,0 .局部变量 值数组,文本型,数组,0 哈希表.取所有键值(键数组, 值数组) ``` 四、高级技巧 1. 哈希冲突处理: - 链地址法:使用链表存储相同哈希值的元素 - 开放寻址法:线性探测或二次探测 2. 性能优化建议: - 预估数据量设置初始大小 - 使用优质哈希函数(如MD5截取) - 及时清理过期数据 五、注意事项 1. 键的唯一性:相同键会覆盖原有值 2. 线程安全:多线程操作需自行加锁 3. 内存管理:大数据量时注意及时释放资源 六、调试技巧 1. 使用`输出调试文本()`查看哈希表状态 2. 通过`取键数量()`监控表大小 3. 检查哈希分布均匀性: ```easycode .局部变量 统计,整数型,数组,100 .计次循环首(哈希表.取键数量(), i) index = 取哈希值(键数组[i]) % 100 统计[index] += 1 .计次循环尾() ``` 建议开发环境配置: 1. 易语言5.9+版本 2. 精易模块v10.3+ 3. E2EE支持库2.3+ 4. 哈希表可视化调试工具(第三方插件) 通过上述方法,开发者可以根据项目需求选择简单数组模拟或高性能第三方模块实现。对于正式项目推荐使用经过验证的第三方模块方案,可保证更好的性能和稳定性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值