哈希查找

哈希函数的构造方法常用的有5种,分别是数字分析法,平方取中法,分段叠加,伪随机数法和余数法,其中余数法比较常用

虽然通过构造好的哈希函数可以减少冲突,但冲突是不可能完全避免的,所以就相应的产生了避免哈希冲突的4种方法,分别是开放定址法(包括线性探测再散列和二次探测再散列),链地址法,再哈希法和建立公共溢出区

 

开放定址法中的线性探测再散列比较常用,该方法的特点是在冲突发生时,顺序查看表中的下一单元,直到找出一个空单元或遍历全表

#include <stdio.h>
#include <time.h>

#define Max 11
#define N 8
int hashtable[Max];

int func(int value)
{
        return value%Max;
}

int search(int key)
{
        int pos,t;
        pos = func(key);
        t = pos;

        while(hashtable[t] != key && hashtable[t] != -1)
        {
                t = func(t+1);
                if(pos == t) return -1;
        }
        if(hashtable[t] == -1) return 0;
        return t;
}

void createhash(int key)
{
        int pos,t;
        pos = func(key);
        t = pos;
        while(hashtable[t] != -1)
        {
                t = func(t+1);
                if(pos == t) return;
        }
        hashtable[t] = key;
}

int main(void)
{
        int arr[50];
        int i,j,t;

        for(i = 0;i<Max;i++)
        {
                hashtable[i] = -1;
        }

        for(i=0;i<50;i++)
        {
                arr[i] = i;
                createhash(i);
        }

        scanf("%d",&t);

        i = search(t);

        printf("%d",i);

        return 0;
}