哈希表(散列表)
哈希法牺牲空间换取了时间,因为要使用额外的数组、set 或者 map 来存放数据,才能实现快速的查找;
- 常见的哈希结构:数组、集合、映射
哈希结构的选取
数据结构 | 特点 |
---|---|
数组 | 长度有限,便于查询但不擅长插入; 如果元素过少,哈希值太大会造成内存的浪费; |
set (集合) | 内部元素只能是一个key |
map(映射) | <key, value>结构,可分别保存键值和对应数据 |
求解算法题时,应先分析题目后选择具体哪种哈希结构;进一步选择是需要:
- 一般的容器即可?(map、set);
- 还是无序列但是效率更高的?(unordered_map、unordered_set);
- 或是可存放重复值?(multimap、multiset);
- 哈希法作用原理
- 根据关键码的值直接访问数据;(数组就是哈希表结构,其中关键码就是索引下标)
- 哈希法主要解决什么问题?
- 一般用来快速判断一个元素是否出现在集合中;
- 数据是怎样和关键值相匹配的?
- 哈希函数(散列函数)将数据直接映射到哈希表上的索引,(例:hashCode 可以通过特定编码方式将其他数据格式转化为不同的数值,进一步其他格式的数据可以映射到哈希表上的索引数字)
- 映射过程中为什么会有哈希碰撞问题?
- 如果数据规模大于哈希表的大小,可能救会出现多个不同的数据都映射到了索引的同一位置,此现象称为“哈希碰撞”;
- 如何解决哈希碰撞问题?
- (1)拉链法:在冲突发生的索引位置引出一个链表,将冲突元素都存储在此处链表中;(既不会因为数组空值而浪费大量内存,也不会因为链表太长而在查找上浪费时间)
- (2)线性探测法:前提要保证哈希表大于数据规模,将要发生冲突的元素存放在空位中;