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

    文章

    4942

    浏览量

    73160
  • 哈希函数
    +关注

    关注

    0

    文章

    43

    浏览量

    9712
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微 RK3588 平台 Debian 系统开发案例与使用说明

    主频调节等核心内容,还包含 TFTP/NFS 服务搭建与挂载、程序开机自启动等实操指南,为评估板 Debian 系统开发与运维提供完整技术支持。
    的头像 发表于 11-05 14:28 298次阅读
    瑞芯微 RK3588 平台 Debian <b class='flag-5'>系统开发</b>案例与使用说明

    程序加载过程遇到的问题及其解决方法

    。重新启动Nuclei Studio,该问题解决。 (2)遇到的问题2:下载程序显示未连接到开发板,报错界面如下图所示。 解决方法:在配套文档,只要求安装
    发表于 10-30 07:59

    IP地址冲突导致德国站群服务器断网的解决方法?

    在网络管理,IP地址冲突是一个常见且令人头疼的问题。尤其是对于依赖站群服务器进行大规模网络操作的企业而言,IP冲突可能会导致整个服务器群组无法正常工作,从而造成严重的业务中断。本文将探讨如何解决因
    的头像 发表于 08-12 15:47 593次阅读

    明远智睿SSD2351:开启嵌入式系统开发新时代

    在当今科技飞速发展的时代,嵌入式系统已经广泛应用于各个领域,从智能家居到工业自动化,从智能交通到医疗设备,嵌入式系统无处不在。而开发板作为嵌入式系统开发的核心工具,其性能和功能直接影响
    的头像 发表于 07-15 15:47 409次阅读

    泰克MSO2024B混合信号示波器在嵌入式系统开发的应用

    MSO2024B混合信号示波器以其高性能参数、灵活的触发机制和全面的协议解码能力,成为嵌入式系统开发的理想选择。本文将深入探讨其在嵌入式系统开发的具体应用及优势。   一、泰克MS
    的头像 发表于 06-16 15:40 584次阅读
    泰克MSO2024B混合信号示波器在嵌入式<b class='flag-5'>系统开发</b><b class='flag-5'>中</b>的应用

    瑞芯微RK3506 3核A7@1.5GHz+双网口+双CAN-FD 工业开发板—Linux系统开发手册

    本文主要演示Linux系统开发流程。包括LinuxSDK的配置与编译,U-Boot、Kernel及Rootfs开发,以及系统镜像的替换方法,旨在帮助
    的头像 发表于 05-20 09:24 1148次阅读
    瑞芯微RK3506 3核A7@1.5GHz+双网口+双CAN-FD 工业<b class='flag-5'>开发</b>板—Linux<b class='flag-5'>系统开发</b>手册

    iic协议常见故障及解决方法

    SDA和时钟线SCL)进行通信。I2C协议以其简单性和低功耗特性,在嵌入式系统得到了广泛应用。 常见故障 通信失败 原因 :可能是由于总线冲突、设备地址错误、数据线或时钟线短路或断路。 解决
    的头像 发表于 02-05 11:38 4601次阅读

    Dali通信系统常见故障及解决方法

    ,导致控制信号丢失。 1.2 故障原因 物理连接问题,如断线、接触不良。 通信线路受到电磁干扰。 设备地址冲突。 1.3 解决方法 检查所有连接,确保线路完整且接触良好。 使用屏蔽电缆,并确保电缆远离强电磁场。 检查设备地址设置,确保没有重复。 2. 设备
    的头像 发表于 01-10 10:38 1743次阅读

    基于步进电机的柴油机EGR系统开发与试验研究

    基于步进电机的柴油机EGR系统开发与试验研究
    发表于 01-09 15:01 0次下载

    电子焊接的常见问题及解决方法

    电子焊接是电子组装过程的关键步骤,焊接质量的好坏直接影响电子产品的性能和可靠性。在电子焊接过程,经常会遇到一些常见问题,掌握其解决方法对于提高焊接质量具有重要意义。以下是几种常见的电子焊接
    的头像 发表于 01-09 10:28 1923次阅读

    gitee 常见问题及解决方法

    Gitee作为国内的代码托管平台,在使用过程可能会遇到一些问题。以下是一些常见问题及其解决方法: 一、仓库创建与代码推送问题 仓库已存在远程配置 问题 :在尝试为已有项目添加远程仓库配置时,可能会
    的头像 发表于 01-06 10:06 2359次阅读

    mac的常见问题解决方法

    Mac常见问题解决方法 1. 系统启动缓慢 问题描述: 启动Mac时,系统启动缓慢,甚至出现卡顿现象。 解决方法: 检查启动项目: 打开系统
    的头像 发表于 12-19 15:02 1864次阅读

    诊断系统开发咨询服务

    随着汽车电控系统复杂度及消费者对于汽车售后服务水平要求的提升,诊断系统开发在整车开发的重要度日益突出。经过多年的实践,经纬恒润积累了丰富的经验,业务涵盖诊断协议及功能定义、诊断测试、
    的头像 发表于 12-18 16:30 979次阅读
    诊断<b class='flag-5'>系统开发</b>咨询服务

    LDO在嵌入式系统的应用 常见LDO故障及解决方法

    的应用及其常见故障和解决方法的概述。 应用场景 电源转换 :LDO可以将电池电压或其他电源电压转换为嵌入式系统所需的稳定电压。 噪声抑制 :LDO能有效降低电源线上的噪声,为敏感的模拟电路提供干净的电源。 功耗管理 :在低功耗应用
    的头像 发表于 12-13 09:08 3095次阅读

    Ubuntu系统常见问题及解决方法

    Ubuntu是一个基于Linux的开源操作系统,以其稳定性和易用性而受到许多用户的喜爱。然而,在使用过程,用户可能会遇到各种问题。以下是一些Ubuntu系统中常见的问题及其解决方法
    的头像 发表于 12-12 14:32 2326次阅读