幾種HASH函式在POJ2503上的時間比較

2021-09-30 07:28:23 字數 1582 閱讀 2084

用得是鄰接表,沒有用vector,用c++提交

前面我先用map水過去,當時用map時間是800多ms

elfhash    219ms

bkdrhash   235ms

sdbmhash   250ms

rshash   250ms

jshash   250ms

pjwhash  250ms

djbhash  204ms

aphash  266ms

這些時間跟資料都有一定的關係,但是幾個函式用時都還是比較穩定的,都在200多ms,還要多做題目,多進行比較,才能有更多的經驗

一部分的**,用elfhash

#include

#include

#define n 100003

#define mod 100003

struct node

char english[20],foreign[20];

int next;

}word[n];

int first[n];

int m;

int elfhash(char* key)

unsigned long g,h=0;

while(*key)

h=(h<<4)+*key++;

g=h & 0xf0000000l;

if(g) h^=g>>24;

h&=~g;

return h%mod;

void insert(char english,char foreign)

strcpy(word[m].english,english);

strcpy(word[m].foreign,foreign);

int h=elfhash(foreign);

word[m].next=first[h];

first[h]=m++;

int find(char foreign)

int h=elfhash(foreign);

for(int i=first[h];i!=-1;i=word[i].next)

if(strcmp(word[i].foreign,foreign)==0)  return i;

return -1;

int main()

//freopen("in.txt","r",stdin);

//freopen("out.txt","w",stdout);

char str[100];

m=0;

memset(first,-1,sizeof(first));

while(gets(str))

if(str[0]==0)   break;

char a[20],b[20];

sscanf(str,"%s %s",a,b);

insert(a,b);

while(scanf("%s",str)!=eof)

int ans=find(str);

if(ans>=0)  printf("%s/n",word[ans].english);

else printf("eh/n");

return 0;

Hash函式和Hash衝突

2.rehash 3.鍊錶法 4.建立公共溢位區 一 簡介 將任意長度的數值以某個對映規則對映為固定長度的數值,這個過程稱為hash,而這個對映規則被稱為hash函式,而對這個key value進行儲存的資料結構被稱為hash表。由於通過key的hash對映直接得到了記憶體位址,所以hash查詢的時...

幾種經典的hash演算法

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

幾種經典的hash演算法

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