数据结构与算法之美学习笔记:第十九讲

经过上一节的学习,咱们知道,散列表的查询效率并不能笼统地说成是O(1)。它跟散列函数、装载因子、散列冲突等都有关系。若是散列函数设计得很差,java

或者装载因子过大,均可能致使散列冲突发生的几率升高,查询效率降低。函数


在极端状况下,有些恶意的攻击者,还有可能经过精⼼构造的数据,使得全部的数据通过散列函数以后,都散列到同一个槽里。若是咱们使用的是基于链表的冲突解决冲法,性能

那这个时候,散列表就会退化为链表,查询的时间复杂度就从O(1)急剧退化为O(n)。

学习

若是散列表中有10万个数据,退化后的散列表查询的效率就降低了10万倍。更直接点说,若是以前运⾏100次查询只须要0.1秒,那如今就须要1万秒。this

这样就有可能由于查询操做消耗耗量CPU或者线程资源,致使系统没法响应其余请求,从而达到拒绝服务攻击(DoS)的⽬的。这也就是散列表碰撞攻击的基本原理线程


今天,咱们就来学习一下,如何设计一个能够应对各类异常状况的⼯业级散列表,来避免在散列冲突的状况下,散列表性能的急剧降低,而且能抵抗散列碰撞攻击?设计

1、散列表的查询效率

 

2、如何设计散列函数

一、散列函数的设计不能太复杂

 

二、散列函数生成的值要尽量随机而且均匀分布

 

三、散列函数的设计方法

3、装载因子过大了怎么办

一、会有什么后果3d

二、数据集合code

三、动态散列表对象

四、动态扩容

一、方法

 

二、存在的问题

 

三、支持动态扩容散列表插入操做的时间复杂度

 

四、实际状况

 五、装载因子的大小须要选择得当

4、如何避免低效地扩容

一、正常状况

二、特殊状况

三、如何解决一次性扩容耗时过多

 

四、屡次插入期间查询操做如何处理

5、如何选择冲突解决方法

一、实际的软件开发中经常使用

二、开放寻址法

一、优势

二、缺点

三、总结

 

三、链表法

一、优势

二、缺点

 

三、实际应用

四、总结

 

 

6、工业级散列表举例分析

一、初试大小

 

二、装载因子和动态扩容

三、散列冲突解决方法

四、散列函数

 其中,hashCode()返回的是Java对象的hash code。好比String类型的对象的hashCode()就是下面这样:

public int hashCode() {
  int var1 = this.hash;
  if(var1 == 0 && this.value.length > 0) {
    char[] var2 = this.value;
    for(int var3 = 0; var3 < this.value.length; ++var3) {
      var1 = 31 * var1 + var2[var3];
    }
    this.hash = var1;
  }
  return var1;
}

7、解答开篇

相关文章
相关标签/搜索