lec13-14
约 665 个字 27 张图片 预计阅读时间 2 分钟
0. 复习排序¶
- 算法的特点
- 给你一个序列,告诉你经过两轮排序的结果,问用什么方法;
 
 - 各种算法的时间复杂性
- 简单排序
 - 快速排序(基数排序跟位数有关系)
 
 - 各种算法的空间复杂性(指要用多少额外的空间
- 快速排序用到递归(O(logN));
 
 - 算法排序的稳定性问题
- 保证相同的数值,本来在前面之后还是在前面,那么就是稳定的;
 - 一般会跨越交换的就是不稳定的;
 
 
1. HASHING¶
本质上是空间换时间;

1.1 General Idea¶
管理与操作字典:插入单词,删除单词,查找单词(最主要);
Hash Tables¶

目标:设计一个好的哈希函数;设计一个好的解决冲突算法;
1.2 Hash Function¶
特点¶
- 
(好算)f ( x ) must be easy to compute and minimizes the number of collisions.
 - 
(没有偏见,均匀映射)f ( x ) should be unbiased. That is, for any x and any i, we have that Probability( f ( x ) = i ) = 1 / b. Such kind of a hash function is called a uniform hash function.
 
哈希函数¶
- 求余法;(用素数比较好)
 - 平方取中法(平方,取中间的数字为哈希值);

 - 折叠法(分成n块,再加起来,就是最后的哈希值);

 - 数字分析法;
 
例子(整数、字符串¶



把x27改成向左移动五位;

1.3 Separate Chaining(解决冲突)¶
方法¶
- Separate Chaining,一层一层往上累加;
 - 开放地址法之线性探测,有冲突就会往后找;
 - 公共溢出区法,冲突的全部记在一起;
 
创建代码¶

- 
首先判断,如果比较小直接插入排序就好了,不需要哈希;
 - 
申请空间产生一个哈希表;
 - 
比table size大一点的素数作为table size;
 - 产生指针数组;
 - for循环,设置空头结点;

 

Find¶
- 通过算法算出哈希值,这就是链表所在地;
 - 在单向链表里寻找;
 

Insert¶
- 首先Find,看看元素在不在里面,如果在里面就不需要插入了;
 - 先申请空间,然后开始插入;
- 先算出哈希值,然后接入(链表头插入);

 
 - 先算出哈希值,然后接入(链表头插入);
 
1 HASHING(12.20)¶
1.4 Open Addressing¶
基本思路¶
不断增加偏移量,看有没有冲突;

1 线性探测¶

- 
平均成功查找次数(枚举法即可)
 - 
平均不成功查找次数:根据哈希函数不成功查找的字符串分成若干种类型,全部加起来,除以类的总个数;
 
2 Quadratic Probing¶
如果加的超过范围了就求余,二次查找避免了拥挤,但是他不一定能够找到空位;



一些其他方法¶

Find Insert and Delete¶


3 Double Hashing¶


4 Rehashing¶


本文总阅读量次