0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MASS竞猜幸运哈希游戏系统开发中冲突的解决方法

開發丨KFZ433 来源:開發丨KFZ433 作者:開發丨KFZ433 2022-06-29 16:51 次阅读

3.2 链地址法

链地址法就是将相应位置上冲突的所有关键词存储在同一个单链表中。

设关键字序列为 47 , 7 , 29 , 11 , 16 , 92 , 22 , 8 , 3 , 50 , 37 , 89 , 94 , 21 47, 7, 29, 11, 16, 92, 22, 8, 3, 50, 37, 89, 94, 2147,7,29,11,16,92,22,8,3,50,37,89,94,21,散列函数取为h ( k e y ) = k e y m o d    11 h(key) = key \mod 11h(key)=keymod11,用分离链接法处理冲突。

pYYBAGK8EYuAM8EkAAO9Y8tZolU243.png

表中有9个结点只需1次查找,5个结点需要2次查找,所以查找成功的平均查找次数为:

A S L s = ( 9 + 5 ∗ 2 ) / 14 ≈ 1.36

参考代码:

#include

#include

#include

#include

#include

using namespace std;

#define MAXTABLESIZE 10000 //允许开辟的最大散列表长度

#define KEYLENGTH 100 //关键字的最大长度

typedef int ElementType;

struct LNode

{

ElementType data;
LNode *next;

};

typedef LNode *PtrToNode;

typedef PtrToNode LinkList;

struct TblNode

{

int tablesize;  //表的最大长度
LinkList heads; //存放散列单元数据的数组

};

typedef struct TblNode *HashTable;

/返回大于n且不超过MAXTABLESIZE的最小素数/

int NextPrime(int n)

{

int p = (n % 2) ? n + 2 : n + 1; //从大于n的下一个奇数开始
int i;
while (p <= MAXTABLESIZE)
{
    for (i = (int)sqrt(p); i > 2; i--)
    {
        if ((p % i) == 0)
            break;
    }
    if (i == 2)
        break; //说明是素数,结束
    else
        p += 2;
}
return p;

}

/创建新的哈希表/

HashTable CreateTable(int table_size)

{

HashTable h = (HashTable)malloc(sizeof(TblNode));
h->tablesize = NextPrime(table_size);
h->heads = (LinkList)malloc(h->tablesize * sizeof(LNode));
//初始化表头结点
for (int i = 0; i < h->tablesize; i++)
{
    h->heads[i].next = NULL;
}
return h;

}

/查找数据的初始位置/

int Hash(ElementType key, int n)

{

//这里只针对大小写
return key % 11;

}

/查找元素位置/

LinkList Find(HashTable h, ElementType key)

{

int pos;
pos = Hash(key, h->tablesize); //初始散列位置
LinkList p = h->heads[pos].next; //从链表的第一个节点开始
while (p && key != p->data)
{
    p = p->next;
}
return p;

}

/插入新的元素/

bool Insert(HashTable h, ElementType key)

{

LinkList p = Find(h, key); //先查找key是否存在
if (!p)
{
    //关键词未找到,可以插入
    LinkList new_cell = (LinkList)malloc(sizeof(LNode));
    new_cell->data = key;
    int pos = Hash(key, h->tablesize);
    new_cell->next = h->heads[pos].next;
    h->heads[pos].next = new_cell;
    return true;
}
else
{
    cout << "键值已存在!" << endl;
    return false;
}

}

/销毁链表/

void DestroyTable(HashTable h)

{

int i;
LinkList p, tmp;
//释放每个节点
for (i = 0; i < h->tablesize; i++)
{
    p = h->heads[i].next;
    while (p)
    {
        tmp = p->next;
        free(p);
        p = tmp;
    }
}
free(h->heads);
free(h);

}

int main(int argc, char const *argv[])

{

int a[] = {47, 7, 29,29, 11, 16, 92, 22, 8, 3, 50, 37, 89, 94, 21};
int n = 15;
HashTable h = CreateTable(n);
for (int i = 0; i < n; i++)
{
    Insert(h, a[i]); //插入元素
}
for (int i = 0; i < h->tablesize; i++)
{
    LinkList p = h->heads[i].next;
    while (p)
    {
        cout << p->data << " "; //打印哈希表元素
        p = p->next;
    }
    cout << endl;
}
return 0;

}

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4554

    浏览量

    66726
  • 哈希函数
    +关注

    关注

    0

    文章

    43

    浏览量

    9386
收藏 人收藏

    评论

    相关推荐

    ARM嵌入式Linux 系统开发从入门到精通

    ARM嵌入式Linux 系统开发从入门到精通
    发表于 03-10 18:44

    PCB压合问题解决方法

    PCB压合问题解决方法
    的头像 发表于 01-05 10:32 342次阅读

    QE for AFE嵌入式系统开发的评估工具说明

    电子发烧友网站提供《QE for AFE嵌入式系统开发的评估工具说明.pdf》资料免费下载
    发表于 12-21 10:27 0次下载
    QE for AFE嵌入式<b class='flag-5'>系统开发</b>的评估工具说明

    三相电缺相的原因及解决方法

    三相电缺相的原因及解决方法 三相电缺相是指三相供电系统中某一相或多相出现故障或中断的情况。常见的缺相原因包括线路故障、设备故障、接线错误、过载等,解决方法则包括检查和修复故障线路或设备、调整电路连接
    的头像 发表于 12-11 17:16 7607次阅读

    基于模型的设计嵌入式电机控制系统开发

    电子发烧友网站提供《基于模型的设计嵌入式电机控制系统开发.pdf》资料免费下载
    发表于 11-23 09:26 0次下载
    基于模型的设计嵌入式电机控制<b class='flag-5'>系统开发</b>

    GSM系统中干扰问题的分类、定位和解决方法

    电子发烧友网站提供《GSM系统中干扰问题的分类、定位和解决方法.pdf》资料免费下载
    发表于 11-17 16:53 0次下载
    GSM<b class='flag-5'>系统</b>中干扰问题的分类、定位和<b class='flag-5'>解决方法</b>

    嵌入式系统开发资料分享

    电子发烧友网站提供《嵌入式系统开发资料分享.rar》资料免费下载
    发表于 11-10 09:41 0次下载
    嵌入式<b class='flag-5'>系统开发</b>资料分享

    ARM应用系统开发详解——基于S3C4510B的系统设计

    电子发烧友网站提供《ARM应用系统开发详解——基于S3C4510B的系统设计.rar》资料免费下载
    发表于 11-08 15:35 0次下载
    ARM应用<b class='flag-5'>系统开发</b>详解——基于S3C4510B的<b class='flag-5'>系统</b>设计

    MSP430单片机应用系统开发平台的研究

    电子发烧友网站提供《MSP430单片机应用系统开发平台的研究.pdf》资料免费下载
    发表于 10-27 11:00 0次下载
    MSP430单片机应用<b class='flag-5'>系统开发</b>平台的研究

    基于网络的嵌入式监控系统开发

    电子发烧友网站提供《基于网络的嵌入式监控系统开发.pdf》资料免费下载
    发表于 10-12 10:30 0次下载
    基于网络的嵌入式监控<b class='flag-5'>系统开发</b>

    基于DSP的数据采集系统开发与实现

    电子发烧友网站提供《基于DSP的数据采集系统开发与实现.pdf》资料免费下载
    发表于 10-07 11:10 0次下载

    Maven依赖冲突的几种常用方法

    Maven依赖冲突是一个很常见的问题,它通常发生在项目中有多个依赖包含相同库的不同版本时。我这边解决Maven依赖冲突的几种常用方法如下: 1、 显示依赖树 首先,使用以下命令查看项目的依赖
    的头像 发表于 09-30 11:11 339次阅读
    Maven依赖<b class='flag-5'>冲突</b>的几种常用<b class='flag-5'>方法</b>

    嵌入式Linux系统开发介绍

    Linux 系统开发 基于 linux 操作系统开发我们的产品叫 linux系统开发。此开发的编程方式和裸机
    的头像 发表于 07-27 17:00 831次阅读
    嵌入式Linux<b class='flag-5'>系统开发</b>介绍

    保护死区的概念和解决方法

    保护死区的概念和解决方法
    的头像 发表于 07-15 11:02 847次阅读
    保护死区的概念和<b class='flag-5'>解决方法</b>

    Linux系统开发环境搭建

    今天给大家讲一讲Linux系统开发环境搭建。
    发表于 07-12 14:51 681次阅读
    Linux<b class='flag-5'>系统开发</b>环境搭建