字符串hash函数
轉(zhuǎn)自 http://www.cppblog.com/shyli/archive/2007/04/07/21455.html 字符串hash函數(shù) 字符串hash函數(shù),解決沖突用開放定址法,每次對哈希值加1
在下列程序中,不是按常規(guī)方法用哈希表來記錄關(guān)鍵字,
而是用整型數(shù)組Htable記錄關(guān)鍵字在字符串ch中的位置。
在插入時不用把關(guān)鍵字復(fù)制到哈希表中,只是記錄一個索引,從而提高了效率。
當(dāng)查詢時,只要把Htable的值映射到字符串ch中就可以了。
注意ch的下標(biāo)要從1開始,因?yàn)镠table中的零值認(rèn)為是空,處理起來比較方便。 #include<iostream>
#include<string>
using?Namespace?stdnamespace?std;
const?int?MAXN?=?9973;?//哈希表長度
const?int?len?=?30;?//字符串的最大長度
int?Htable[MAX];
char?ch[MAX][len];?//存儲關(guān)鍵字的字符串
unsigned?long?Hash(char?*?key)
{
????unsigned?long?h?=?0;
????while(*key)
????{
????????h?=?(h?<<?4)?+?*key++;
????????unsigned?long?g?=?h?&?0xf0000000L;
????????if(g)
????????????h?^=?g?>>?24;
????????h?&=?~g;
????}
????return?h?%?MAX;
}
int?search(char?*?key)
{
????unsigned?long?i?=?Hash(key);
????while(Htable[i])
????{
????????if(strcmp(ch[Htable[i]],?key)?==?0)
????????????return?i;
????????i?=?(i?+?1)?%?MAX;
????}
????return?-1;
}
int?insert(char?*?key,?int?j)?//j為關(guān)鍵字在ch中的位置,即索引
{
????unsigned?long?i?=?Hash(key);
????while(Htable[i])
????????i?=?(i?+?1)?%?MAX;
????Htable[i]?=?j;
????return?i;
} ?
在下列程序中,不是按常規(guī)方法用哈希表來記錄關(guān)鍵字,
而是用整型數(shù)組Htable記錄關(guān)鍵字在字符串ch中的位置。
在插入時不用把關(guān)鍵字復(fù)制到哈希表中,只是記錄一個索引,從而提高了效率。
當(dāng)查詢時,只要把Htable的值映射到字符串ch中就可以了。
注意ch的下標(biāo)要從1開始,因?yàn)镠table中的零值認(rèn)為是空,處理起來比較方便。 #include<iostream>
#include<string>
using?Namespace?stdnamespace?std;
const?int?MAXN?=?9973;?//哈希表長度
const?int?len?=?30;?//字符串的最大長度
int?Htable[MAX];
char?ch[MAX][len];?//存儲關(guān)鍵字的字符串
unsigned?long?Hash(char?*?key)
{
????unsigned?long?h?=?0;
????while(*key)
????{
????????h?=?(h?<<?4)?+?*key++;
????????unsigned?long?g?=?h?&?0xf0000000L;
????????if(g)
????????????h?^=?g?>>?24;
????????h?&=?~g;
????}
????return?h?%?MAX;
}
int?search(char?*?key)
{
????unsigned?long?i?=?Hash(key);
????while(Htable[i])
????{
????????if(strcmp(ch[Htable[i]],?key)?==?0)
????????????return?i;
????????i?=?(i?+?1)?%?MAX;
????}
????return?-1;
}
int?insert(char?*?key,?int?j)?//j為關(guān)鍵字在ch中的位置,即索引
{
????unsigned?long?i?=?Hash(key);
????while(Htable[i])
????????i?=?(i?+?1)?%?MAX;
????Htable[i]?=?j;
????return?i;
} ?
轉(zhuǎn)載于:https://www.cnblogs.com/marsmars/archive/2008/02/18/2298976.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
- 上一篇: 什么情况导致全表扫描,而不是用索引 收藏
- 下一篇: Address already in u