初學JAVA資料——哈希表

散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的 數據結構。也就是說,它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫作 散列函數,存放記錄的 數組叫作 散列表
給定表M,存在函數f(key),對任意給定的關鍵字值key,代入函數後若能獲得包含該關鍵字的記錄在表中的地址,則稱表M爲哈希(Hash)表,函數f(key)爲哈希(Hash) 函數。
#define HASHSIZE 32    


//待存入表格數據

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<32))
    {
        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;
}
相關文章
相關標籤/搜索