?? p382.cpp
字號:
const int PageSize = 2; //一個頁塊的最大容量
const int CharNum = 2; //關鍵碼中的字符數(包括串結束符)
struct TwoChars
{
char str[CharNum];
}; //每個關鍵碼兩個字符
struct page { //頁塊構造
int PgDepth; //區分關鍵碼的二進位位數, 即局部深度
TwoChars Names[PageSize]; //關鍵碼數組, 每頁最大可容納的關鍵碼個數
int Count; //在本頁塊中的實際關鍵碼數目
};
typedef page *paddr; //頁塊指針
int DicDepth; //目錄深度, 即最大局部深度, 不超過WordSize
paddr *Directory;
int hash ( TwoChars key ) {
//使用一個均勻分布的散列函數對關鍵字key進行計算, 函數返回一個隨機化的地址
int Sum = 0, j = 0, len = 0;
for ( int i=0; i<=CharNum; i++ )
if ( key.str[i] == '\0' || key.str[i] == '\n') break;
else len++; //計算關鍵碼的字符數
if ( len % 2 == 1) //如果len是奇數, 在關鍵碼尾加一空白, 使len成為偶數
{ key.str[len+1] = key.str[len]; key.str[len] = ' '; len++; }
while ( j < len ) {
Sum = ( Sum + 100 * key.str[j] + key.str[j+1] ) % 19937; j += 2;
}
return Sum;
}
unsigned int makeAddress ( const TwoChars & key , const int depth ) {
//將由關鍵碼key轉換成的散列值按指定的低階二進位數depth再轉換成二進位序列, 作為頁塊地址返回。
int hashval = hash ( key ); //將關鍵碼轉換成為一個整型的散列值
unsigned int retval = 0, mask = 1; //累加結果位串置初值及抽取最低位的屏蔽單元
for ( int j=1; j<=depth; j++ ) { //按照指定二進位數循環, 逐位轉換
retval = retval << 1; //結果左移一位
retval = retval | mask; //將最低位拼入結果
}
retval=retval&hashval;
return retval;
}
int operator ==(const TwoChars& left,const TwoChars& right)
{
return ((left.str[0]==right.str[0])&&(left.str[1]==right.str[1]));
}
inline unsigned int Power2(unsigned int n)
{
return 1<<n;
}
void InitHash(void)
{
DicDepth=0;
Directory=new paddr[1];
Directory[0]=new page;
Directory[0]->Count=0;
Directory[0]->PgDepth=0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -