算法刷题--哈希表--字母异位词和两个数组的交集

哈希表概念

哈希表是根据关键码的值而直接进行访问数据结构
直白来讲数组就是一种哈希表。
那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里
那么一般都是将一个集合里面的元素映射为哈希表的索引。
那么设计哈希表的时候需要考虑以下原则:均匀性,尽可能让不同key均匀分布到哈希表中;高效性;覆盖性,确保所有key都能映射到哈希表范围内。
当多个元素映射到同一个索引时,这种现象叫做哈希碰撞
解决哈希碰撞有两种方法:

  • 拉链法,发生冲突的元素都被存储在链表中,这样可以通过索引找到冲突的元素了。这样做就及不会因为数组空值而浪费大量内存,又不会因为链表太长而在查找上浪费太多时间。
    在这里插入图片描述

  • 线性探测法,这种方法一定要保证tablesize要大于datasize,冲突了那么就找下一个空位放置冲突的元素。
    在这里插入图片描述

常见的三种哈希结构

  • 数组
  • set
  • map
    当我们使用哈希法来解决问题的时候,
集合 底层实现 是否有序 数值是否可以重复 能否更改数值 查询效率 增删效率
std::set 红黑树 有序 O(log n) O(log n)
std::multiset 红黑树 有序 O(log n) O(log n)
std::unordered_set 哈希表 无序 O(1) O(1)

set的键值和实值时一个东西,既时键值又是实值。是一个双向迭代器,只能it+±-,不能it+2.

映射 底层实现 是否有序 数值是否可以重复 能否更改数值 查询效率 增删效率
std::map 红黑树 key有序 key不可重复 key不可修改 O(log n) O(log n)
std::multimap 红黑树 key有序 key可重复 key不可修改 O(log n) O(log n)
std::unordered_map 哈希表 key无序 key不可重复 key不可修改 O(1) O(1)

当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。

有效字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值