• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

哈希表使用

武飞扬头像
zero_xk_
帮助1

刷题日记

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

哈希表简介

散列表(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,既然都看到最后了,还麻烦高抬贵手点个赞(* ̄︶ ̄)~

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfhaib
系列文章
更多 icon
同类精品
更多 icon
继续加载