基本資料結構 Hash雜湊

2022-05-24 09:15:12 字數 2471 閱讀 5317

這玩意一直都是個好東西,但是我總覺得玄學的一批。今天藉著專題學習的勁頭,把hash好好梳理一下。

雜湊這東西應該都不陌生。將複雜的資訊對映到乙個容易維護的值域之內。那麼hash函式就有點類似於乙個對映關係。通過這個函式來產生乙個關鍵值(key),通過關鍵值與值(value)的對應關係,製作乙個對應表。即雜湊表(hash table)。他可以實現通過key快速的查詢value。

那麼其最大作用也就顯而易見。查重。也就是說,查詢當前的值是否已經存在。難點在於,如何去產生這個對應關係?簡單的對映關係是有相當的可能產生「兩組不同的值生成同乙個關鍵值」的錯誤(我們稱其為雜湊衝突)。如果雜湊函式的設計太水,那麼這個雜湊衝突也就非常容易產生了。

引用了乙個對整數陣列生成hash的方法,這裡只做舉例。在本例中,不關心陣列中數的序列問題。即只考慮陣列內值不同為不同狀態,如果值相同但順序不同,我們仍認為他是同一狀態。(會產生相同的關鍵值)

對於一組數,其乘積與其累加之和與任意較大質數p取模。

//這裡是針對於某乙個題目所引入的,所以具體原因會在下方的題目展示中闡釋。

常用的字串雜湊分兩類(沒錯,我覺得該分兩類的!)

自然溢位式hash與多重hash。一般來講,前者雖然發生雜湊衝突的機率非常小,但總會被刁鑽(誒嘿嘿)的出題人卡幾個資料。是的,他們是具備能卡你自然溢位單雜湊的能力的。所以穩妥起見,後者運用頻率偏高一些。

什麼是字串雜湊?就是把乙個任意長度的字串對映成乙個非負整數,並且其衝突概率幾乎為0

把字串看作p進製數,並分配乙個大於0的數值,代表每種字元。啥意思啊?比如a對應1,b對應2,c對應3。取乙個固定的值m,求出該p進製數對於m的餘數,作為該字串的雜湊值。一般來說,p取131或者13331,這樣衝突機率就極低。一般m取264,也就是乙個自然溢位的unsigned long long。就讓你溢位,取代低效的取模運算。

這也就是第一類hash。為了避免被卡,我們多取一些適當的p與m。(例如大質數),進行多組hash運算。如果結果都相同,我們就認定這是乙個相等的字串。

對沒錯!我覺得這是性質!!

有了以下兩種性質,我們便可以做到在o(n)的時間內預處理所有字首hash值,並在o(1)的時間內完成查詢任意字串的雜湊值。

一、對於任意新字串s+c,他的hash值就是

h(s+c)=(h(s)*p+value[c])mod m

為什麼?我們來進行乙個簡單的模擬。

例如,s="abc",c=「d」

s表示為p進製的數:1 2 3

h(s)=1*p2+2*p+3

h(s+c)=1*p3+2*p2+3*p+4=h(s)*p+4

這裡可以把*p的操作視為在p進製下的左移運算。value[c]是我們為c選定的代表數值。

二、如果已知字串s的hash值為h(s),字串s+t的hash值為h(s+t),那麼字串t的hash值

h(t)=(h(s+t)-h(s)*plength(t)) mod m

那麼我們繼續之前的模擬。

例如,s="abc",c=「d」,t=「xyz」

s表示為p進製的數:1 2 3

s+t的p進製數為:1 2 3 24 25 26

h(s)=1*p2+2*p+3

h(s+t)=1*p5+2*p4+3*p3+24*p2+25*p+26

s在p進製下左移length(t)位:1 2 3 0 0 0 

兩者相減就是t表示為p進製數:24 25 26

h(t)=h(s+t)-(1*p2+2*p+3)*p3=24*p2+25*p+26

等待補充

由於目標題庫被查表…等待恢復。

因為這是乙個專題博文,所以我不會去仔細深究他沒有涉及到雜湊的原理。

在這道題中,我們可以列舉每乙個長度為m的子串。那麼一共會有n-m+1個長度為m的子串。我們將他們的雜湊值分別取出來,然後再進行比對。如果相等,則忽略,否則ans++

我聽說這道題用自然溢位雜湊是翻車了的。故我貼這個題的目的,是想貼一下雙雜湊的大概樣子。

#include#define n 200009

using

namespace

std;

char

a[n];

long

long ans, n, m,hs2[n], len1[n], len2[n], hs1[n],p1=131,p2=13331,mod1=1000000009,mod2=1000000007

;struct

hahhash[n];

long

long

cmp(hah x, hah y)

void

prepare()

}void gethash(long

long l, long

long r, long

long

oi)int

main()

資料結構之雜湊(hash)表

最近看php陣列底層結構,用到了雜湊表,所以還是老老實實回去看結構,在這裡去總結一下。這裡先說一下雜湊 hash 表的定義 雜湊表是一種根據關鍵碼去尋找值的資料對映結構,該結構通過把關鍵碼對映的位置去尋找存放值的地方,說起來可能感覺有點複雜,我想我舉個例子你就會明白了,最典型的的例子就是字典,大家估...

Redis資料結構之雜湊hash

雜湊型別 hash 用於儲存鍵值對結構的資料,值只能是字串 hset 新增資料,返回1或0 hset key field value127.0.0.1 6379 hset user 1 name redis integer 1hmset 批量新增資料 hmset key field1 value1 ...

opencv基本資料結構

iplimage 首先介紹重要的成員變數 width和height表示了的尺寸。其次是depth和nchannels,depth是指畫素顏色的取值範圍,nchnannels為影象的通道,可以取1,2,3,4 origin變數定義了影象的原點,有兩個取值,分別是ipl origin bl和ipl or...