看了july關於暴雪hash演算法的講解,有幾個地方沒理解。
暴雪hash與普通hash不同的是,使用了更好的hash值
使用3個hash值,乙個用於查詢,兩個用於校驗
如果出現衝突,尋找下乙個,如果到了陣列尾部還沒找到,則表示字串不存在。
那麼最大的不同應該就是使用三個hash值,在比較的時候不直接比較字串而比較另外兩個hash值,另外為啥不使用鍊錶呢?
先把july的**貼上來
#define _crt_secure_no_warnings
#include #include //多謝citylove指正。
#include #include //cryttable裡面儲存的是hashstring函式裡面將會用到的一些資料,在preparecrypttable
//函式裡面初始化
const int ntablesize = 2000;
const int nmaxstrlen = 2000;
unsigned long crypttable[0x500];
typedef struct _a
mpqhashtable;
///function: 雜湊詞典 編碼
//parameter:
//author: lei.zhou
//time: 2011-12-14
/mpqhashtable testhashtable[ntablesize];
//以下的函式生成乙個長度為0x500(合10進製數:1280)的crypttable[0x500]
void preparecrypttable() }}
//以下函式計算lpszfilename 字串的hash值,其中dwhashtype 為hash的型別,
//在下面gethashtablepos函式裡面呼叫本函式,其可以取的值為0、1、2;該函式
//返回lpszfilename 字串的hash值;
unsigned long hashstring(const char *lpszfilename, unsigned long dwhashtype)
return seed1;
}//直接呼叫上面的hashstring,nhashpos就是對應的hash值。
int insert_string(const char *string_in)
ln = strlen(string_in);
if (!testhashtable[nhashpos].bexists && (ln < nmaxstrlen))
else
return nhashpos;
}int gethashtablepos(char *lpszstring, mpqhashtable *lptable, int ntablesize)
else
if (nhashpos == nhashstart)
break;
} return -1;
}int main(int argc, char **argv)
我的思路,不知道對不對,求改正
既然已經有了三個hash值,並且三個hash值都相同的概率極低,那麼為何不直接利用這三個hash值來查詢呢
意思是,將乙個大的陣列分為n個小陣列(人為的),比如大陣列長度10000,我分為10個小陣列,那麼每個小陣列長度為1000,0-999,1000-1999,。。。。。。。。。
第二層,同樣的利用第二個hash值,將上面的小陣列在分,
第三層,同上,不知道這樣效率會不會更高。
寫個**試試
不理解筆記
不明白 def print nums x for i in range x print i return print nums 10 rest 4 0 rest 4 1 rest 4 2 rest 4 3 def func x res 0 for i in range x res i return ...
病例 不理解C C 的函式指標
一直對函式指標的概念一知半解的,於是搜尋了一把,發現幾個帖子講解不錯,就帖子這裡了.病例 不理解c c 的函式指標 大怪獸 病人 醫生,我折騰了 許久,無法理解函式指標。中醫 能意 識到自己不理解,不錯。那 麼你 說說你目前的理解。函式指標是什 麼?病人 函式指 針是指向函式的指標。中醫 那麼 函式...
CSS不理解的知識點
使用條件 單獨使用他們的時候均沒有效果需要是使用了絕對定位absolute的時侯才能其作用。left 靠左邊距離多少 right 靠右邊距離多少 top 距離頂部距離為多少 bottom 距離下邊距離為多少 舉例說明如下 left 50px就是距離左邊的距離就是50px 如果為 50px 那麼就會像...