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