首页 > 其他分享 >由入门题回想起来的哈希表

由入门题回想起来的哈希表

时间:2023-04-01 11:23:11浏览次数:45  
标签:回想起来 TableSize int 哈希 键值 Key HashMap 入门

洛谷P2550

P2550 [AHOI2001]彩票摇奖 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

可以看到这是个入门题,完全可以用暴力查找(for循环二重嵌套)来实现,但是这个查找形式让我想起了一个月之前学的哈希表(HashMap)

众所周知,利用哈希表可以将查找的时间复杂度优化到O(1)的水平,而且本题需要存储的对照数据只需要六个,所以哈希表的实现是非常简单的

但是,我TM已经忘干净了,于是紧急复习了一下

众所周知,哈希表是利用键值对来实现对元素的快速查找的,每一个值(元素)都对应着唯一的一个键(key),所以构建哈希表的关键就是对于给定的值,如何构建其唯一对应的键来存储以及查找它。

我们通常自己构造一个哈希函数来实现值对键的计算,一个较为简单的方法就是

1 int Get_Key(int n,int TableSize)
2 {
3          return n%TableSzie;//这里的表长一般取大于存储数据个数的一个质数
4 }

也就是值对哈希表的长度取模作为键值。但是显然,会出现多个元素对应一个键值的冲突,为了避免这种冲突,有一种叫做开放定址法的方法,也就是把冲突的元素重新在表中找一个位置填入

对于开放定址法,分为线性探测法和平方探测法,其中线性探测法实现简单但是会造成平均查找次数增多,元素会越来越集中的弊端,不过实现简单,这里我只举出线性探测法的例子

所谓线性探测,就是说当我们发现一个元素的键已经有数据存储的时候,我们便将这个元素加i在进行取模,得到相对的键值(说到这里,其实平方探测法就是将元素加上+-i的平方再进行取模罢了),方便起见,一次冲突就加上i=1,两次冲突就加上i=2,以此类推直到找到没有被占用的键值

代码实现如下

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define INF -1;
 4 int Get_Key(int n,int TableSize)
 5 {
 6     return n%TableSize;
 7 }//哈希函数定义 
 8 int main()
 9 {
10     int N;
11     scanf("%d",&N);//要存入的数据 
12     int TableSize=7;//哈希表长 
13     int HashMap[TableSize];
14     memset(HashMap,-1,sizeof(HashMap));//定义-1为未定义也就是为占用标志 
15     int Key=Get_Key(N,TableSize);//获取初始键值 
16     for(int i=1;;i++)
17     {
18         if(HashMap[Key]=INF)//如果该键值未被占用,则填入元素,退出循环 
19         {
20         HashMap[Key]=N;
21         break;
22         } 
23         else//被占用了就继续加1向后一个坐标来探测 
24         Key=Get_Key(N+i,TableSize);
25     }
26     return 0;
27  } 

好了,至此我们就可以简单的解决入门题P2550辣   

标签:回想起来,TableSize,int,哈希,键值,Key,HashMap,入门
From: https://www.cnblogs.com/WKWKSL/p/17278268.html

相关文章

  • 《Mysql基础》【Mysql函数 mysql数据类型】 编程入门 学习分享 【公开免费】
    -- --mysql数据库程序设计笔记:gb2312是国标,中国字库。一个汉字2个字节。utf8国际通用标准。包含gb2312;外键只能引用主键和候选键。外键只可以在InnoDB中使用。字段约束:字段类型后可加:check(多个列判断条件)列为:column用col1、col2....代替一、mysql函数:聚合函数:1、......
  • 《Mysql基础》【Mysql添加外键(新增外键)、mysql添加主键、mysql删除外键】 编程入门 学
    --mysql数据库程序设计笔记:--新建表:foreignkey加外键举例:createdatabasedb_test_1defaultcharactersetgb2312defaultcollategb2312_chinese_ci;usedb_test_1;createtablea(idintnotnullauto_incrementcomment'id自增',ainfovarchar(255),primarykey......
  • 《Mysql基础》【Mysql小数浮点数】double float decimal数据类型 编程入门 学习分享
    -- --mysql数据库程序设计笔记:-------------小数测试--------------------double浮点小数(最多小数位后15位,)使用8个字节存储。--float单精度小数:(最多小数位后6位)使用4个字节存储。--举例保留2位:float(18,2),或:double(20,2)--decimal(最多小数位后30位)(存储空间更优,更小,......
  • odoo 开发入门教程系列-计算的字段和变更(Computed Fields And Onchanges)
    计算的字段和变更(ComputedFieldsAndOnchanges)模型之间的关系是任何Odoo模块的关键组成部分。它们对于任何业务案例的建模都是必要的。然而,我们可能需要给定模型中字段之间的链接。有时,一个字段的值是根据其他字段的值确定的,有时我们希望帮助用户输入数据。“ComputedField......
  • 《Mysql基础-1》【新建数据库】 【新建表】编程入门 学习分享 公开免费
    --mysql数据库程序设计笔记:--mysql安装路径my.ini中把:default-character-set=utf8改为default-character-set=gbk后重启客户端。--创建数据库:createdatabasedb_schooldefaultcharsetgb2312collategb2312_chinese_ci;usedb_school;--1、学生表:createtabletb_s......
  • 《Mysql基础》【供应商表】 编程入门 学习分享 【公开免费】
    --mysql数据库程序设计笔记:createdatabasedb_spdefaultcharactersetgb2312defaultcollategb2312_chinese_ci;usedb_sp;createtableS(SNOchar(5)comment'供应商编号',SNAMEvarchar(255)notnulluniquecomment'供应商名称,不为空且唯一',STATUSint(3)comm......
  • odoo 开发入门教程系列-模型之间的关系(Relations Between Models)
    模型之间的关系(RelationsBetweenModels)上一章介绍了为包含基本字段的模型创建自定义视图。然而,在任何真实的业务场景中,我们都需要不止一个模型。此外,模型之间的链接是必要的。人们可以很容易地想象一个模型包含客户,另一个模型则包含用户列表。你可能需要参考任何现有业务模型......
  • Flask快速入门day 01(flask介绍、快速使用、配置文件、路由系统)
    目录Flask框架前言:一、flask介绍1、介绍2、使用两种协议编写web二、flask快速使用1、快速使用:2、使用flask编写登录小案例2.1login.html2.2home.html2.3detail.html2.4py文件三、flask配置文件1、配置文件的几种方式方式一:直接编写方式二:使用app.config方式三:使用py文件,然后......
  • Ansible 快速入门到放弃
    Ansible快速入门到放弃最是人间留不住,朱颜辞镜花辞树。1-Ansible简介Ansible是一个配置管理和配置工具,它使用SSH连接到服务器并运行配置好的任务,服务器上只需要开启ssh,所有工作都交给client端的ansible负责。当我们有批量部署的需求时,我们可以自己写脚本,但是更推荐使用Ansibl......
  • 【webserver 前置知识 02】Linux网络编程入门其一
    网络结构模式C/S结构服务器-客户机,即Client-Server(C/S)结构。C/S结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器,服务器则是提供信息供人访问的计算机。在C/S结构中,应用程序分为两部分:服务器部分和客户......