映射(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)),但是二叉搜索树是有序的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值