📄 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 + -