6.4哈希表

一.哈希表的使用

#define HASHSIZE 13
#define NULLKEY -32456 //哈希表的初始值

1.结构体与初始化

//结构体
typedef struct
{
    int *elem;//数据元素基址,动态分配数组
    int count;//当前数据元素个数
}HashTable;

//初始化
int InitHashTable(HashTable *H){
   //连续空间,将每个空间赋初值 
    H->count=HASHSIZE;
    H->elem=(int *)malloc(HASHSIZE*sizeof(int));
if(!H->elem){
    return -1;
}
for(int i=0;i<HASHSIZE;i++){
    H->elem[i]=NULLKEY;
}
    return 0;
}

2.对散列表进行插入

//降低冲突可能性
int HashFunction(int key, int p)
{
    return (key%p);//这里P取质数
}

void InsertHashTable(HashTable *H, int key)
{
    int addr;
    addr = HashFunction(key, HASHSIZE);

    while (H->elem[addr] != NULLKEY)
    {
        addr = HashFunction((addr + 1), HASHSIZE);
        //开放定址
    }
    H->elem[addr] = key;
}

3.哈希表查找关键字的地址

int SearchTable(HashTable *H, int key)
{
    int addr = HashFuntion(key, HASHSIZE)
    {
        while (H->elem[addr] != key)
        {
            if (H->elem[addr] == NULLKEY)
            {
                cout << "查找失败" << endl;
                return -1;
            }
            addr = HashFunction((addr + 1), HASHSIZE);
            if (addr = HashFunction(key, HASHSIZE))
            {
                cout << "查找失败" << endl;
                return -1;
            }
        }
        return addr;
    }
}

二.哈希查找

1.重要概念

6.4哈希表_第1张图片

ASL(成功)=查找关键的次数/关键字个数
ASL(失败)=装填因子(计算方式可能不同)
装填因子=表中记录数/散列表长度

2.哈希查找步骤

1.确认关键字与存储地址对应关系

Addr=H(key)
散列函数的指定:
1.除留余数法
H(key)=key%p
2.直接定址法
H(key)=key
H(key)=a*key+b
3.数字分析法
4.平均取中法

2.解决冲突

一.拉链法(链接法、链地址法)

二.开放定址法
重点再于内部增量的设计
1.线性探测法
增量线性递增
2.平方探测法
增量0,1,-1,4,-4,9,-9有序的平方方式递增
3.伪随机序列法
自己创建随机序列

三.再散列法
发生冲突,就会散列函数

你可能感兴趣的:(Alogrithm,数据结构)