锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鐒跺悗鏄疕ashTable綾葷殑楠ㄦ灦錛堟垜鍦ㄨ繖閲屾妸瀹冨皝瑁呮垚綾諱簡錛夛細 鎺ヤ笅鏉ユ槸鏋勯犲嚱鏁幫細 鍏堢暐鍘誨搱甯屽嚱鏁幫紝浠嬬粛鎻掑叆鍑芥暟錛?/p>
鐒跺悗鏄煡鎵撅細 褰撶劧鍙互鏍規嵁鍏蜂綋鎯呭喌鍋氬悇縐嶆敼鍔紝濡傛灉瑕佹瀬闄愯拷姹傛晥鐜囧彲浠ュ湪t_node閲岄潰鎶妅ey鏀逛負鎸囬拡錛岀劧鍚庝嬌鐢ㄨ嚜宸辯紪鍐欑殑鍐呭瓨鍒嗛厤鍑芥暟浠f浛new銆?br />
鍝堝笇琛ㄧ殑緇勭粐鏂瑰紡錛?/strong>
鎴戜滑棣栧厛瑕佺‘瀹氫竴涓搱甯屽嚱鏁癏(x)錛寈鏄璁板綍鐨勫璞★紝鎴戜滑浠(x)鏉ョ‘瀹氬璞$殑璁板綍鐨勯摼鐨勪綅緗?br /> 榪橀渶瑕佷竴涓寚閽堟暟緇勬潵瀛樻斁姣忎釜閾劇殑澶存寚閽堛傜敱浜庤浣跨敤閾捐〃錛屾墍浠ヨ繕瑕佹湁涓涓猚lass/struct浣滀負閾捐〃鐨勫熀鏈崟浣嶃?br />
棣栧厛鏄摼琛ㄧ殑鍩烘湰鍏冪礌錛?/dt>
template<class T>
struct t_node
{
public:
T key;
//other info
t_node* next;
};
template<class T>
class hashtable
{
public:
hashtable();
int hash(const T &sr);
void insert();
t_node *find(const T &sr);
//add more functions
private:
t_node *ht[t_size];//you should define t_size as sth before
//add more things
};
hashtable<T>::hahstable()
{
memset(ht,0,sizeof(ht));
}
void hashtable<T>::insert(const T &sr)
{
int loc = hash(sr);
if (ht[loc] == 0)
{
//姝ゅ涓虹┖錛屾彃鍏ヤ竴涓柊閾捐〃
ht[loc] = new t_node();
ht[loc]-> key = T;
}
else
{
t_node *now = ht[loc];
while (true)
{
if (now->key == sr)
{
//鍏冪礌宸茬粡瀛樺湪銆?nbsp;
return;
}
else if (now->next == 0)
{
//閾鵑噷闈㈡病鏈夎鍏冪礌錛屽氨鍦版彃鍏?/span>
now->next = new t_node();
now->next->key = T;
return;
}
else now = now->next;
}
}
}
t_node *hashtable<T>::find(const T &st)
{
int loc = hash(sr);
if (ht[loc] == 0)
{
//姝ゅ涓虹┖錛屾湪鏈墌 榪斿洖絀烘寚閽?nbsp;
return 0;
}
else
{
t_node *now = ht[loc];
while (true)
{
if (now->key == sr)
{
//鎵懼埌浜?nbsp;
return now;
}
else if (now->next == 0)
{
//閬嶅巻瀹屼簡鏁翠釜閾捐繕鏄湪鏈夈傘?nbsp;
return 0;
}
else now = now->next;//鐪嬭繖涓摼鐨勪笅涓涓厓绱?nbsp;
}
}
}
鏈綆鍗曠殑鍝堝笇鍑芥暟錛?/strong>
鍏跺疄鏈綆鍗曠殑鍝堝笇琛?灝辨槸H(x)=x錛屾剰鎬濇槸鑻ヨ褰曞璞℃槸鏁存暟錛屽氨鐩存帴閲囩敤榪欎釜鏁存暟涓轟笅鏍囷紙char綾誨瀷涔熷彲瑙嗕負鏁存暟錛夛紝榪欎釜灝辨槸鏁扮粍錛屼絾瀹冧篃鍙互鐪嬩綔鍝堝笇琛ㄣ?br />鏈綆鍗曠殑鍝堝笇琛?灝辨槸H(x)=1錛屾剰鎬濇槸涓嶇鏄粈涔堝厓绱犻兘鏀懼埌鍚屼竴涓笅鏍囷紝榪欎釜灝辨槸閾捐〃錛屼篃鍙涓轟竴縐嶅搱甯岃〃銆?br />
澶ф暣鏁扮殑鍝堝笇鍑芥暟錛?/strong>
褰撹褰曞璞℃槸澶ф暣鏁扮殑鏃跺欙紝鑻ュ啀鐢℉(x)=x錛屾暟緇勭殑鑼冨洿灝嗕細鎵垮彈涓嶈搗錛屾墍浠ヨ繖鏃跺欒鑰冭檻鍝堝笇鍑芥暟鐨勮璁¢棶棰橈紝鍙堟湁寰堝縐嶈璁℃柟娉曪紝鏈騫挎硾鐨勪竴縐嶅氨鏄疕(x)=x%k錛宬閫氬父鏄竴涓川鏁般?br />
涓鑸殑鍝堝笇鍑芥暟錛?/strong>
鎴戜滑涔熻浼氳褰曚竴浜沜lass鎴栬卻truct涔嬬被鐨勪笢瑗匡紝榪欐椂鍊欐垜浠彲浠ラ夊彇閲岄潰鐨勬煇浜涘叧閿彉閲忚繘琛屼竴縐嶈繍綆楁潵紜畾涓嬫爣銆?br />
鍐茬獊鐨勫鐞嗭細
鍐嶅ソ鐨勫搱甯屽嚱鏁頒篃寰堥毦閬垮厤鍐茬獊錛屾墍璋撳啿紿佸氨鏄H(a)=H(b)鐨勬儏鍐碉紝鑰屽紑鏁e垪鐨勫鐞嗘柟娉曟槸鍦ㄦ暟緇勫悗闈㈡寕鐨勬槸閾捐〃錛岃繖鏍峰啿紿佺殑鍏冪礌鍙互鐩存帴鎸傚湪閾捐〃鐨勬湯绔紝鑰岄棴鏁e垪娌℃湁閾捐〃錛屼竴鑸槸閲嶅Hn(x)鎴栬呭線H(x)+a(a=1,2,3..)瀵繪壘錛岃繖浼氫嬌鍝堝笇琛ㄥ彉寰椾竴濉岀硦娑傦紝鑰屼笖鍐茬獊榪樺彲鑳藉紩鍙戝埆鐨勫啿紿侊紝鑰屼笖涔熶笉渚夸簬浼拌鍝堝笇鏁扮粍鐨勮寖鍥達紝鎵浠ラ剻浜轟笉鎻愬′嬌鐢ㄩ棴鏁e垪鐨勭粍緇囨柟寮忋?br />欏轟究璇翠竴鍙ワ細濂界殑鍝堝笇鍑芥暟鏄敖閲忓噺灝戝拰騫寵 鍐茬獊錛屽敖閲忎嬌寰楁瘡涓摼鐨勯暱搴﹀垎甯冨緱騫沖潎錛屽ソ鐨勫搱甯屽嚱鏁扮殑璁捐瑕侀潬闀夸箙鐨勭粡楠岀Н绱紝緇濋潪涓鏃ヤ箣鍔熴?br />
鍝堝笇琛ㄧ殑鏈川鎬濇兂錛?/strong>
鏁e垪琛ㄦ湰璐ㄦ濇兂灝辨槸鎶婃暟緇勪笌閾捐〃鐨勪紭鍔跨粨鍚堣搗鏉ワ紝鏁扮粍鐨勮闂鏉傚害鏄疧(1)錛岄摼琛ㄧ殑鎻掑叆澶嶆潅搴︽槸O(1)錛岀劧鑰屾暟緇勭殑鎻掑叆澶嶆潅搴﹀拰閾捐〃鐨勮闂鏉傚害閮芥瘮杈冮珮錛屾墍浠ュ氨浜х敓浜嗘暎鍒楄〃銆傛垜浠彲浠ユ妸榪欎釜鎬濇兂榪愮敤鍒拌澶氬湴鏂癸紝榪欐湰鏄垜鎯寵鐨勯噸鐐癸紝浣嗛剻浜烘墠鐤忓嫻咃紝涓嶇煡濡備綍琛ㄨ揪錛屾棩鍚庢暣鐞嗕竴涓嬩唬鐮佽鏄庡惂銆?/p>
]]>lams@vip.qq.com
]]>