數據結構與算法之美學習筆記:第十九講

經過上一節的學習,咱們知道,散列表的查詢效率並不能籠統地說成是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、解答開篇

相關文章
相關標籤/搜索