数据结构——哈希表的生成

来源:互联网 发布:美工刀片哪个牌子好用 编辑:程序博客网 时间:2024/06/15 15:19

目的: 掌握哈希存储结构的思想,能选择合适的哈希函数,实现不同冲突处理方法的哈希表的查找、建立。

内容:

(1)设计哈希函数及处理冲突的方法;
(2)键盘输入数据,利用设计的哈希函数及线性探测法生成哈希表;
(3)用同样的输入数据和哈希函数,用链地址法处理冲突生成哈希表;
(4)在主函数中设计一个简单的菜单,分别调试上述算法;
(5)分析两种方法的平均查找长度。


借鉴大牛博客:

http://blog.csdn.net/xyzbaihaiping/article/details/51607770

http://blog.csdn.net/wangran51/article/details/8826633/

http://blog.csdn.net/u011080472/article/details/51177412

代码(已由codeblocks编译通过):

#include<bits/stdc++.h>#define N 1009using namespace std;void menu(){    printf("\t\t\t1.闭散列法\n");    printf("\t\t\t2.开链法(哈希桶)\n");    printf("\t\t\t3.退出\n");}void fun1(){    printf("请输入n, p:\n");    int i, n, *a, *b, p;    //double k;    scanf("%d%d", &n, &p);    //L = (int)(1.0*n / k);    a = (int*)malloc((n+9) * sizeof(int));    b = (int*)malloc((p+9) * sizeof(int));    printf("然后输入n个数:\n");    for(i = 1; i <= n; i++) scanf("%d", &a[i]);    int sum = 0;    for(i = 0; i <= p; i++) b[i] = -1;    for(i = 1; i <= n; i++)    {        int key = a[i] % p, num = 1;        while(b[key] != -1) num++, key = (key + 1) % p;        sum += num;        b[key] = a[i];    }    printf("散列表\n");    for(i = 0; i < p; i++) printf("%d%c", b[i], (i == p - 1) ? '\n' : ' ');    printf("平均查找长度(成功)\n");    if(sum % n == 0) printf("%d\n", sum / n);    else    {        int g = __gcd(sum, n);        printf("%d/%d\n", sum/g, n/g);    }}void fun2(){    printf("请输入n, p:\n");    int n, i, j, *a, ans[N], p; ans[0] = 0;    for(i = 1; i <= 100; i++) ans[i] = ans[i - 1] + i;    scanf("%d%d", &n, &p);    a = (int*)malloc((n+9) * sizeof(int));    vector<int> mp[n+9];    printf("然后输入n个数:\n");    for(i = 1; i <= n; i++) scanf("%d", &a[i]);    int sum = 0;    for(i = 1; i <= n; i++)    {        int key = a[i] % p;        mp[key].push_back(a[i]);    }    printf("散列表\n");    for(i = 1; i <= n; i++)    {        int num = mp[i].size();        for(j = 0; j < num; j++) printf("%d%c", mp[i][j], (j == num-1) ? '\n' : ' ');        sum += ans[num];    }    printf("平均查找长度(成功)\n");    if(sum % n == 0) printf("%d\n", sum / n);    else    {        int g = __gcd(sum, n);        printf("%d/%d\n", sum/g, n/g);    }}/*书上例子12 1319 14 23 01 68 20 84 27 55 11 10 79||12 1332 14 23 01 42 20 45 27 55 24 10 53*/int main(){    while(true)    {        int sel;        menu();        scanf("%d", &sel);        switch(sel)        {            case 1: fun1(); break;            case 2: fun2(); break;        }        if(sel == 3) break;    }    return 0;}



阅读全文
0 0
原创粉丝点击