hash演算法(雜湊)

2021-10-02 12:04:46 字數 2468 閱讀 1083

hash 演算法

什麼hash 演算法 ?

簡單地來講就是將字串轉化為乙個整數。它一般應用於字串的場景中。

現在我們來講hash演算法。

hash 公式

hash[i]=(hash[i-1]*base+str[i]-『a』+1)%mod ;

base的值是隨機的,意思就是你自己可以去選擇任意的數,但是按照經驗值表明,一般base的值和mod的值要盡量大,這樣衝突的概率是最低的。

但是經驗告訴我們base=131或者13331是最好的。

其次mod我們也可以省略,只要我們利用unsigned long long的範圍自然溢位,相當於自動取模。

乍一看是不是有點難以理解。

我們現在就來分析一下。

舉乙個栗子str=;

因為a—>z有26個字母,因此我們可以將乙個字串看成乙個26進製的數,然後我們的hash值就等於這個數的10進製值,所以我們就要想法設法得求出這個值,並且得到一些推論和應用。

首先我們定義乙個unsigned long long int hash[1001]的乙個用來儲存hash值的陣列。因此我們可以省略取模的步驟。

hash[0]=0;

當 i =1時,hash[1]=hash[1-1] *base+str[1]-『a』+1=0 *131 +『a』-『a』+1=1;

當 i =2時,hash[2]=hash[2-1] base+str[2]-『a』+1=1131 +『b』-『a』+1=132;

當 i =3時,hash[3]=hash[3-1] *base+str[3]-『a』+1=132 *131 +『c』-『a』+1=17295;

依次類推…

其實很容易就發現,我們的每乙個hash值都與字首的hash值是一一對應的。

「a」的hash值=hash[1];

「ab」的hash值=hash[2];

「abc」的hash值=hash[3];

…那麼我們已知 ab的hash值(也就是hash[2]的值)和abcde的hash值(也就是hash[5]的值)要我們求bcde的hash值。

推**式:hash值=hash[right]-hash[left-1] *base的(right-left+1)次方。

因此bcde的hash值=hash[5]-hash[2-1] *base的(5-2+1)次方

數學理論可以自己私下去推導嘛!

現在我們看例題

很久很久以前,森林裡住著一群兔子。

有一天,兔子們想要研究自己的 dna 序列。

我們首先選取乙個好長好長的 dna 序列(小兔子是外星生物,dna 序列可能包含 26 個小寫英文本母)。

然後我們每次選擇兩個區間,詢問如果用兩個區間裡的 dna 序列分別生產出來兩隻兔子,這兩個兔子是否一模一樣。

注意兩個兔子一模一樣只可能是他們的 dna 序列一模一樣。

輸入格式

第一行輸入乙個 dna 字串 s。

第二行乙個數字 m,表示 m 次詢問。

接下來 m 行,每行四個數字 l1,r1,l2,r2,分別表示此次詢問的兩個區間,注意字串的位置從1開始編號。

輸出格式

對於每次詢問,輸出一行表示結果。

如果兩隻兔子完全相同輸出 yes,否則輸出 no(注意大小寫)。

資料範圍

1≤length(s),m≤1000000

輸入樣例:

aabbaabb

31 3 5 7

1 3 6 8

1 2 1 2

輸出樣例:

yesno

yes其實運用我們那兩個公式就能求出來。

解題思路:我們把每個字首的hash值求出來,然後運用推導公式求出部分字串的hash值,然後對比,相等即yes 反之則no。

**如下

#include

#include

char str[

1000010];

#define base 131

//取base為131;

typedef

unsigned

long

long

int ull;

//太長了,這樣方便一些;

ull hash[

1000010

],p[

1000010];

//定義一下,hash陣列用來存放各個字首的hash值,而p陣列用來存放base的各個次方的值;

intget

(int l,

int r)

//自定義函式用來求各部分字串的hash值;

intmain()

scanf

("%d"

,&m)

;while

(m--

)return0;

}

總結:相對於kmp演算法來說,此演算法易於理解,且簡單,kmp難懂難記。

Hash雜湊演算法

hash演算法 雜湊演算法將任意長度的二進位制值對映為較短的固定長度的二進位制值,短的二進位制值稱為雜湊值。雜湊值是一段資料唯一且極其緊湊的數值表示形式。如果雜湊一段明文而且哪怕只更改該段落的乙個字母,隨後的雜湊都將產生不同的值。要找到雜湊為同乙個值的兩個不同的輸入,在計算上是不可能的,所以資料的雜...

經典的hash演算法 常見hash 雜湊演算法

計算理論中,沒有hash函式的說法,只有單向函式的說法。所謂的單向函式,是乙個複雜的定義,大家可以去看計算理論或者密碼學方面的資料。用 人 類 的語言描述單向函式就是 如果某個函式在給定輸入的時候,很容易計算出其結果來 而當給定結果的時候,很難計算出輸入來,這就是單項函式。各種加密函 數都可以被認為...

Hash 雜湊 雜湊

hash 一種用於查詢的資料結構 雜湊查詢的前提是已經一定的規則方法建好了雜湊表。基本思想是 關鍵字 位址轉換法 以資料物件的關鍵字為自變數,通過乙個確定的函式關係h,計算出對應的函式值h key 把這個值解釋為資料物件的儲存位址,並按此存放,即儲存位置 h key 關鍵 1.構造好的雜湊函式 2....