【算法方法总结·七】哈希的一些技巧和注意事项
【算法方法总结·七】哈希的一些技巧和注意事项
- 【算法方法总结·一】二分法的一些技巧和注意事项
- 【算法方法总结·二】双指针的一些技巧和注意事项
- 【算法方法总结·三】滑动窗口的一些技巧和注意事项
- 【算法方法总结·四】字符串操作的一些技巧和注意事项
- 【算法方法总结·五】链表操作的一些技巧和注意事项
- 【算法方法总结·六】栈队列堆的一些技巧和注意事项
- 【算法方法总结·七】哈希的一些技巧和注意事项 🎯
【哈希】
哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里
枚举 的时间复杂度是
O(n)
,但如果使用 哈希表 的话, 只需要O(1)
就可以做到
数据结构 涉及的基础内容简要讲解,主讲
Hash
函数的使用
哈希函数
- 将任意大小的键(Key)转换为固定大小的整数(哈希值)
哈希碰撞
- 也叫 哈希冲突,即不同键可能生成相同的哈希值(即映射到同一位置)
两种解决办法
(1)拉链法(链地址法)
- 冲突的键值对 追加到链表 中
(2)开放寻址法
- 一般用其中的 线性探测法
- 依靠哈希表中的 空位 来解决碰撞问题
【哈希结构】
数组
、set (集合)
、map(映射)
注意事项
- 使用 数组 来做哈希的题目,是因为题目都 限制了数值的大小,如果哈希值 比较少、特别分散、跨度非常大,使用数组就造成空间的 极大浪费
- 但是能用 数组 解决,尽量不用
set
、map
- 使用
map
的空间消耗要 比数组大一些,因为map
要 维护红黑树或者符号表,而且还要做哈希函数的运算。所以 数组更加简单直接有效。map
是一种key value
的存储结构,可以用key
保存数值,用value
再保存数值所在的下标,map
中的存储结构为{key:数据元素,value:数组元素对应的下标}
【Set
】
HashSet
- 不允许元素重复
1 | Set<String> set = new HashSet<>(); |
TreeSet
1 | // 当使用无参构造器创建 TreeSet 的时候,结果仍然是无序的 |
HashSet
和 TreeSet
如何实现去重
HashSet
必须重写hashCode()
和equals()
方法TreeSet
需实现Comparable
接口或提供Comparator
,定义排序和去重规则。
如果 传入了Comparator
匿名对象,则使用compare
方法,方法 返回0,认为是相同元素;
如果 没有传入,则用Compareable
接口的compareTo
去重。
【Map
】
HashMap
1 | Map<Integer,Integer> map = new HashMap<>(); |
TreeMap
1 | //使用默认的构造器,创建TreeMap, 是无序的(也没有排序) |
Map
接口的遍历方法
keySet()
1 | // 先取出所有的Key , 通过Key取出对应的Value |
values()
1 | Collection values = map.values(); |
entrySet()
最常用
1 | // 通过 EntrySet来获取k-v |
相关力扣题
- 相关解法见【算法题解答·七】哈希
349. 两个数组的交集
1. 两数之和
454.四数相加II
15. 三数之和
18. 四数之和
49.字母异位词分组
128.最长连续序列
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 易思涯の博客!