Day6 哈希表理论基础 || 有效字母异位词 || 两个数组的交集 || 快乐数 || 两数之和

1 哈希表(Hash Table)理论

官方说法:哈希表是根据关键码的值直接进行访问的数据结构

这么说比较晦涩,其实一个数组就是一张哈希表.哈希表中关键码就是数组的索引下标.

1.1 哈希表能解决的问题:

用来快速判断一个元素是否在集合里.

或者比较A和B元素个数是否相同(也就是所有A元素都在B集合里,其实就是A和B元素及元素个数相同,看下面第一个例子)/A和B的交集(看下面第二个),这些本质上都是判断某个元素在集合里出现过没

我的理解就是,把西瓜苹果进货,按hashTable放到对应的柜子里,柜子总数是所有水果种类,然后存好了下次问你来找某个水果/或者比较个数

比如一个人是不是在某所学校,用枚举的时间复杂度是O(n).用哈希表的时间复杂度是O(1).
怎么做到的呢?初始化就把所有名字都存到哈希表了.查询的时候就能直接通过索引找了.

而把名字映射到哈希表就涉及到了哈希函数(hash function)

1.2哈希函数

在存储数据时,我们先对数据进行一些简单描述,比如“苹果,22块,快坏了”,对这些信息用哈希函数处理后就得到了一个通过整数index(里面的过程是通过对信息通过特定编码后的hashcode取余tablesize)


image.png
  • 但是就算通过这个编码方式映射的再均匀,数据个数大于tablesize的话总会有不同的数据落到同一个索引下标的位置(同一个抽屉).由此引出哈希碰撞(hash collision)

1.3 哈希碰撞 hash collision

不同数据映射到同一索引下标的位置

image.png

两种解决方法:

  1. 拉链法
    冲突的地方设成链表

    image.png

  2. 线性探测法

前提:tablesize要大于datasize,才能用表里的空位解决collision

image.png

1.4常见的哈希结构

  • 数组(数组就是个简单哈希表)
  • set
  • map

基本判断:hash表范围不大,可控的时候用数组(比如26个字母);

范围特别大或者数值虽然不大,但是分布特别散,一个在1,一个在100W用set;

出现key,value用map

2 242.有效的字母异位词

题目
题解

2.1tips

  • [i-'a']在JS里不能自动转化成ASCII码相减(是在C里可以),我一开始和'2'-'1'字符串自动转为number相减混淆了
  • 要得到字母对应的ASCII码,JS里用的是字符串的方法charCodeAt()
  • JS里用 for...of...可以遍历数组、set、map、字符串.

3 349.两个数组的交集

题目
题解

这个题leecode改过范围,变小了所以用数组也可以做,这里我们要求用set做,练手

3.1 tips

  • JS中的set 用let mySet = new Set([1,2,3])定义,()里面是个数组.这是ES6引入的,同时引入的还有map

    • set的元素是唯一的,重复添加也没用,只留一个
  • 比较nums1和nums2的大小,从而后面循环的时候用小的,优化性能.

  • 建了两个set,一个是长的数组的set,其实就是hashTable,另一个放结果.

  • set的has()方法直接找索引,时间复杂度O(1)

  • 向set添加元素:set.add()

  • 最后还要用Array.from(resSet)来把set转化成array返回

    • 力扣上大部分都是让返回数组,除非他让你return(Set<number>)
  • 学了个if单行代码的炫技写法:
    if(A)B;写成A&&BA成立的时候后面的statement肯定是true
    (学错了,&&后面得是expression不能是statement,statement不产生value,所以下面的写法不对:)
    (nums1.length<nums2.length) && [nums1,nums2] = [nums2,nums1];只有expression才能返回value,&&右边明显是statement
    正确的写法:num1Set.has(nums2[i])&&resSet.add(nums2[i]);

4 202.快乐数

题目
题解

题解说也用set,但是我想不出来这个要把什么放到盒子里,不知道要把什么设成hashtable,然后看了眼题目,觉得应该是判断是不是会循环,因为如果出现了之前的就说明循环了

5 1.两数之和

题目
题解

为什么不用array:存字母好存,且能控制长度,但是这个题目n的长度不一定多大.
为什么不用set:返回不了下标.
所以用map.

那么就有两个问题需要解决:

  • map用来干嘛
    用来在我们遍历当前元素的时候询问map里有没有已经遍历过的与当前元素的值相加=target的元素,没有就把当前元素添加进去
  • map的key和value都是什么
    这里也有个很容易出错的点:我总是默认把下标当key,元素值当value,
    但是我们要找的是value,所以把元素值当value反而更直观

5.1 tips

  • 做到这个题的时候我还没复习到map,下意识以为和Set一样要new Set()这样,但是如果不是很复杂的问题,比如要频繁删除键值对的话,直接用对象就行了:test = {};然后其中的key的表示方法就是test[]所以遍历的时候就可以用test[target-nums[i]]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容