现在的位置: 首页 > 综合 > 正文

哈希表

2019年09月05日 ⁄ 综合 ⁄ 共 1477字 ⁄ 字号 评论关闭

 哈希表:根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映像到
  一个有限的连续的地址集(区间)上,并以关键字在地址集中得像
  作为记录在表中得存储位置,这种表便是哈希表,这一映像过程成
  为哈希造表的散列,所得到的位置称哈希地址或散列地址。
哈希函数的构造方法:直接地址法,数字分析法,平方取中法,折叠法,
     除留余数法,随即数法。
处理冲突的方法:开放地址发,再哈希法,链地址发,建立一个公共溢出域。

 

#define HASHSIZE 32 //32,50,101

 

//待存入表格数据
char *keywords[] = {
  "auto",   "break",  "case",     "char",   "const",    "continue", "default", 
  "do",
  "double", "else",   "enum",     "extern", "float",    "for",      "goto",    
  "if",
  "int",    "long",   "register", "return", "short",    "signed",   "sizeof",  
  "static",
  "struct", "switch", "typedef",  "union",  "unsigned", "void",     "volatile",
  "while"
};

 

char keybuf[HASHSIZE][10];
static char val_flag[HASHSIZE];//标志已占用存储单元

 

void ClearFlag()
{
 int i;
 
 for (i = 0;i < HASHSIZE;i++)
 {
  val_flag[i] = (HASHSIZE+1);//清标志位
 }
}

 

//哈希函数,从数据中抽出某个成员用于哈希值的计算
unsigned int hash(char *s)
{
 unsigned int hashval;
 int i = 0;

 for (hashval = 0; *s != '\0'; s++)
  hashval = *s + 31 * hashval;
 hashval = hashval % HASHSIZE; //计算下标

 while ((val_flag[hashval] != (HASHSIZE+1)) && ((i+hashval)<HASHSIZE))
 {
  i++;
  hashval = (hashval + i)%HASHSIZE; //冲突处理,存储单元(下标)偏移
 }
 if (i<HASHSIZE)
 {
  printf("\n元素下标(%d): 冲突次数: %d -- ",hashval,i);
  val_flag[hashval] = hashval; //表示该单元被占用
  return hashval;
 }
 return -1;
}

 

 

int main(void)
{
  int i, size, pos;

  size = sizeof(keywords) / sizeof(keywords[0]);//计算关键字数量
 
  //将数据存入哈希表
  ClearFlag(); 
  for(i = 0;i < size; i++)
   strcpy(keybuf[hash(keywords[i])],keywords[i]);

  //根据数据结构中某个成员作为索引值,查找对应数据
  ClearFlag();
  for(i = 0; i < size; i++)
  {
    pos = hash(keywords[i]); 
    printf("%-10s: %-3d\n", keybuf[pos], pos);
  }

  return 0;
}

抱歉!评论已关闭.