hash演算法入門

2021-08-27 04:10:03 字數 2261 閱讀 4218

今天呢,我們簡單說一下雜湊suan演算法,這個演算法的內容可以說應該是非常的多的,今天呢我們ji就只學一些簡答的,就是關於字串處理的。

首先呢我們先簡單的說一下什麼是hash.

先舉個例子。我們每個活在世上的人,為了能夠參與各種社會活動,都需要乙個用於識別自己的標誌。也許你覺得名字或是身份證就足以代表你這個人,但是這種代表性非常脆弱,因為重名的人很多,身份證也可以偽造。最可靠的辦法是把乙個人的所有基因序列記錄下來用來代表這個人,但顯然,這樣做並不實際。而指紋看上去是一種不錯的選擇,雖然一些專業組織仍然可以模擬某個人的指紋,但這種代價實在太高了。

其實吧我理解的意思就是給一些東西起個名字,讓我們能夠知道誰是誰,而且還是不重複的,就例如我們每個人的身份證號,我們每乙個人一出生就會有乙個自己的身份證號,而且還是獨一無二的,不會有人給你相同,所以你的身份證號就可以代表你這個人。其實我感覺hash就是幹的這些事,就是給一些東西取個名字,讓我們能夠根據這個名字找到它。

今天我們就來學有關字串的hash:

上面我門已經說過了hash就是給一些東西取個名字,那麼字串的hash呢?不錯,就是給一些字串娶乙個名字,在這裡我們取得名字都是以數字來命名的。

我們知道,a的ascii碼是97,那麼在ascii碼中97就是代表著a,現在我們要幹什麼是呢?就是讓沒乙個字串都對應乙個數字,而且不同的字串對應的數字一定要是不一樣的,例如我們以乙個標準去賦給每乙個字串值:

a   1;

ab   15;

abc   97;

基本上就是這個樣子的,現在在我們的這一套標準中1這個數字就是代表的a,如果有兩個字串所對應的數字都是97,那麼我們就可以說這兩個字串相等,試想一下如果每乙個字串都對應乙個不同的數字,那麼當我們在對字串處理的時候是不是就非常的的簡單了呢?下面給一道例題:

假如我給你n個字串,而且每個字串的長度不超過100,現在我問你,在我給的這n個字串裡面有多少個不相同的字串,如果我們沒有學習hash,這題是不是不太會做,但是當我們學習了hash之後,這樣的題是不是就變的非常的簡單了,我們定義乙個標準,讓每乙個字串都對應乙個數字,那麼最後只要我們查一下有多少個不同的數字都行了,看吧!這道題是不是看起來非常的簡單了呢?

你們現在是不是已經大致上了解了hash得一些內容,是不是已經感受到它的魅力了,是不是已經喜歡上了這個演算法了呢?

但是有個問題出現了,就是我們應該怎樣去做,才能讓每乙個字串都對應不同的數字,沒錯,這的確是乙個問題,接下來我們就來解決這個問題。

首先呢我們先給定乙個字串 str[100],然後我們再定義兩個數字p,mod,然後我們再給乙個hash函式,

hash[i]=(hash[i-1]*p+str[i])%mod.

只要我們取得p和mod合適,那麼每個字串都會對應乙個唯一的值,接下來就是怎麼取p和mod了,其實就是越大越好,接下來我會教大家一種取得方法,至於為什麼這個問題目前我也不便解答,因為我能力有限,想知道的可以自行了解。

p的取法其實也可以很大,視情況而定,大概取有多少個字母都行了,至於mod,既然越大越好,那麼我們就直接取最大的,unsigned long long,

給定乙個字串,其中含有不同的字母數量為m,現在求這個字串中有多少個長度為n且長的互不相同的字元子串 

舉個例子, n=3, m=4 ,字串 "daababac". 長度為3的不同的子串分別是: "daa"; "aab"; "aba"; "bab"; "bac". 因此, 答案是5. 

input

第一行是兩個整數n,m,,乙個空格隔開。 接下來一行是我們要解決的字串.( 你可以認為字串的長度不會超過一千六百萬。)orz我讀錯題了,並不是字串長度不超過1600萬,是合理hash之後的hash的值不超過1600萬。orz原諒我

output

程式應該輸出乙個整數,對應於給定文字中所找到的大小為n的不同子字串的數量。

輸入資料

3 4

daababac

輸出資料

5
hint

輸入資料量龐大,推薦使用scanf

這道題就是一道的典型的hash.

#include#include#includeusing namespace std;

# define ull unsigned long long

char ch[16000005];

int main()

se.insert(hash);//自動去掉重複的數字。

}printf("%d\n",se.size());

return 0;

}

hash表 hash演算法

概念 雜湊表 hash table。也叫雜湊表 是依據關鍵碼值 key value 而直接進行訪問的 資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。給定表m,存在函式f key 對隨意給定的keyword值ke...

hash位址 Hash演算法基礎

hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的,就是把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊...

Hash演算法與Hash碰撞

什麼是hash演算法。雜湊函式 英語 hash function 又稱雜湊演算法 雜湊函式,是一種從任何一種資料中建立小的數字 指紋 的方法。雜湊函式把訊息或資料壓縮成摘要,使得資料量變小,將資料的格式固定下來。該函式將資料打亂混合,重新建立乙個叫做雜湊值 hash values,hash code...