您的位置:首页 > 编程语言

线性探测再散列解决冲突的哈希表

2010-12-30 13:19 826 查看
今天又完成了一道编程题。此题是用线性探测再散列解决冲突的哈希表设计题。

完成后还是有些困惑,发现自己对算法分析不是特理解。例如,“平均查找长度的上限为2”就不是特别理解。

虽然算法写完了,但是性能不知道有没有题中所说的那样“平均查找长度的上限为2”呢?

希望懂的GG,MM帮忙看下~哦

/*

作者:徐**

日期:12.29  918

Version:v1.0

作用:为班级30个人设计一个Hash表,要求

用除留余数数法构造Hash表,用线性探测再

散列法处理冲突,平均查找长度的上限为2

*/

#include <stdio.h>

#include <string.h>

#define MAX 50

#define STU_MAXNUM 30

#define NULLKEY -1

typedef int KeyType;

typedef struct

{

    KeyType key_num;

    char name[30];

}RecordType;

typedef RecordType HashTable[MAX];

void Init(HashTable ht)

{

    int i;

    for(i = 0; i < MAX; i++)

    {

        ht[i].key_num = NULLKEY;

    }

}

int Hash(int key)

{

    int mode = key % 13;

    return mode;

}

int InsertHash(HashTable ht, RecordType record)

{

    int p0 = Hash(record.key_num);

    if(ht[p0].key_num == NULLKEY)

    {

        ht[p0].key_num = record.key_num;

        strcpy(ht[p0].name, record.name);

    }

    else     //如果发生冲突,则用线性探测再散列解决冲突

    {

        int i, pi;

        for(i = 1; i <= MAX - 1; i++)

        {

            pi = (p0 + i) % MAX;

            if(ht[pi].key_num == NULLKEY)

            {

                ht[pi].key_num = record.key_num;

                strcpy(ht[pi].name, record.name);

            }

        }

    }

    return 1;

}

int Hash_Create(HashTable ht)

{

    int count = 0;

    RecordType record;

    for(count = 0; count < STU_MAXNUM; count++)    //产生STU_MAXNUM(30)个学生的记录

    {

        memset(&record, 0x00, sizeof(record));

        printf("Please input a key_num of student : ");

        scanf("%d", &(record.key_num));   

        getchar();

        printf("Please input name of this student : ");

        gets(record.name);

        InsertHash(ht, record);

    }

    printf("/nCreate Successfully!/n");

    return 1;

}

int Hash_Search(HashTable ht, int key)

{

    int p0;

    p0 = Hash(key);

    if(ht[p0].key_num == NULLKEY) return NULLKEY;    //如果为空键值,则表示查找失败

    else if(ht[p0].key_num == key) return p0;

    else        //用线性探测再散列法解决冲突

    {

        int i;

        int pi;

        for(i = 1; i <= MAX - 1; i++)

        {

            pi = (p0 + 1) % MAX;

            if(ht[pi].key_num == NULLKEY) return NULLKEY;

            else if(ht[pi].key_num == key) return pi;

        }

    }

    return NULLKEY;

}

int main()

{

    int key = NULLKEY;

    HashTable ht;

    Init(ht);

    Hash_Create(ht);

    printf("Please input the key you want Search : ");

    scanf("%d", &key);

    key = Hash_Search(ht, key);

    if(key != NULLKEY)

    {

        printf("key_num : %d/nname : %s/n", ht[key].key_num, ht[key].name);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息