映射(Map)&集合(Set)(hashtable)


在这里插入图片描述

Hash Function

hash函数和hash表常要解决如下问题,加入一个班级有三十个学生,他们名字就是各个英文的名字,然后把三十个学生的名字放到一个表里去,怎么把不同的人放到不同的位置,以让你更快的找到人。
若是放在数组就不容易找,比如问jack在哪,只能从数组最开始线性的找,那么能否用O(1)的方式来查找。
可以用Hash函数
假设lies这个人,把lies当成这个人名字,我们需要找到一个hash fuction把他对应一个数值,这个数字是0-29然后放到相应位置即可·,这里可以有多种方式,关键不同英文字符对应不同下标即可,这里举个例子选取每个字母的ascii码,加一起得到和。再模上一个30得到的就是这个元素它的位置。
在这里插入图片描述
如果另一个名字加起来也是429会冲突吗?
基本上都会有冲突,而且把大于30的元素放在30的表里也基本会有碰撞
下图9要放两个元素一个lies一个foes
这时在这个位置建立一个链表,所有元素都存在这个位置,这个叫做拉链法解决hash冲突

在这里插入图片描述

list vs map vs set

list的实现可以是数组也可以是链表,关键可以是重复的,同时所有元素在一个表中,插入的话是o(1)的时间,进行查找是o(n)时间
map是映射
set是集合,不允许有重复元素,是list去重,一般用hash表或二叉树来实现。查找的时候是o(1)时间复杂度或者o(log(n))时间复杂度
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
 Hash表要略快二叉搜索树,时间复杂度一个O(1)一个 O(log(n)),但是二叉搜索树是有序的