1. Hash表介绍
1.1 Hash映射与碰撞
- 哈希表可以根据关键码的值直接访问值,原理为通过哈希函数,以key值作为输入,计算得到数值,以该数字作为数组的索引下标,从而完成key到value的映射。
- 因为hash表的本质就是一个数组,所以即使hash函数再均匀,也避免不了会发生碰撞。
- 如何解决碰撞?
拉链法:发生冲突的元素存储在链表中
线性探测法:一旦发生碰撞,就找向下一个空位来放置信息。
1.2 常见Hash结构
- 数组
- set
其中红黑树是一种平衡二叉搜索树,key值是有序的,无法修改,智能增删。
在有序哈希中,key值是有序存储的,访问value时依旧是使用Hash映射。
小结
哈希表是典型的牺牲空间换时间,当遇到了需要快速判断一个元素是否出现在集合里的时候,就要考虑Hash算法。
2. 数组当哈希表使用
2.1 简介
- 每个数组下标对应一个key,将key与下标一一对应。
- 如26个字母a-z,a对应0,z对应25
- 给定两个字符串s和t,判断t和s是否元素相同仅仅位置不同,LeetCode-242。
2.2 关键问题
- 如何才能判断两个字符串的所有元素是相等的呢?
- 首先,判定t和s中包含的元素种类是相等的
- 其次,不同元素种类出现在两个串中的次数也是相等的
- 解决方案:
把下标与字母进行映射,因为字母数量少,key对应字母(下标),value就是字母在字符串中出现的次数。
2.3 核心代码
/**
* @author zdh
* @date 2021/4/24 18:19
*/
public class ValidAnagram {
public boolean isAnagram(String s, String t) {
int[] hashArray = new int[26];
if(s.length() != t.length())
return false;
for (int i = 0; i < s.length(); i++) {
hashArray[s.charAt(i)-'a']++;
}
for (int i = 0; i < t.length(); i++) {
hashArray[t.charAt(i)-'a']--;
}
for (int i = 0; i < 26; i++) {
if(hashArray[i] != 0)
return false;
}
return true;
}
}