PART1:按照数据结构分:
-
数组
-
链表
-
(子)字符串、子数组、(子)序列
-
树
PART2:按照题型分:
- 手写系列
- 括号问题
- 队列:
- 栈:
- 堆:
- 散列表(哈希表)&图
- 哈希表又叫散列表,是一种根据设定的映射函数f(key)将一组关键字映射到一个有限且连续的地址区间上,并以关键字在地址区间中的“像”作为元素在表中的存储位置的一种数据结构。这个映射函数f(key)即为哈希函数也叫散列函数,通过哈希函数得到的存储位置称为哈希地址或散列地址
- 构造哈希函数的方法:或者说如何减少哈希冲突?
一个好的哈希函数可以有效的减少哈希冲突的出现
。- 直接定址法:取关键字或关键字的某个线性函数值为散列地址。即hash(k)=k或hash(k)=ak + b,其中a,b为常数 ;对于不同的关键字不会产生冲突,
缺点是由于关键字集合很少是连续的,会造成空间的大量浪费
。 - 除留余数法:
取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即hash(k)=k mod p, p≤m
。不仅可以对关键字直接取模,也可在折叠法、平方取中法等运算之后取模。- 对p的选择很重要,一般取小于m的最大素数,
若p选择不好,容易产生冲突
。
- 数字分析法:假设关键字是以r为基的数,并且哈希表中可能出现的关键字都是事先知道的,则可选取关键字的若干数位组成哈希地址;需要对关键字进行分析。
- 平方取中法::取关键字平方后的中间几位为哈希地址。
- 折叠法:将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。
- 直接定址法:取关键字或关键字的某个线性函数值为散列地址。即hash(k)=k或hash(k)=ak + b,其中a,b为常数 ;对于不同的关键字不会产生冲突,
- 解决哈希冲突的方法:
- 开放地址法:我感觉其实就是不停来回转悠,看还有没有其他空位
- 链地址法:将所有具有相同哈希地址的记录放在同一单链表中,哈希表的第i个元素存放哈希地址为i的记录组成的单链表的头指针。
- 建立一个公共溢出区:一旦产生冲突,均把当前记录放入公共溢出区的当前表尾。
- 再哈希法:
再哈希法即选取若干个不同的哈希函数,在产生哈希冲突的时候计算另一个哈希函数,直到不再发生冲突为止
。
- 开放地址法:我感觉其实就是不停来回转悠,看还有没有其他空位
- 构造哈希函数的方法:或者说如何减少哈希冲突?
- 哈希表又叫散列表,是一种根据设定的映射函数f(key)将一组关键字映射到一个有限且连续的地址区间上,并以关键字在地址区间中的“像”作为元素在表中的存储位置的一种数据结构。这个映射函数f(key)即为哈希函数也叫散列函数,通过哈希函数得到的存储位置称为哈希地址或散列地址
未完待续…