手写哈希类

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<math.h>
 4 #define Mod 100007     //取模的大小,哈希表的大小...
 5 #define Max 50         //存放的总数
 6 typedef long long LL;
 7 class Hash             //手写哈希
 8 {
 9   public:
10     int hs[Mod];       //哈希值  设定的哈希函数为 原值 % Mod ,所以哈希值有可能是 0 ~ Mod-1
11     int next[Max];     //链表    存放哈希值相等的一条链,他的大小取决于所有原值的数量
12     LL S[Max];         //存放原值
13     int H[Max];        //存放所有哈希值
14     int sn;            //不同原值的数量
15     int hn;            //不同哈希值的数量
16     Hash()             //构造函数: 定义Hash类变量时初始化
17     {
18       sn=0;
19       hn=0;
20       for(int i=0;i<Mod;i++)
21         hs[i]=0;
22     }
23     void clear()       //清空函数
24     {
25       sn=0;
26       for(int i=0;i<hn;i++)
27         hs[H[i]]=0;
28       hn=0;
29     }
30     void add(LL s)           //加入
31     {
32       int ha=abs(s)%Mod;     //计算哈希值
33       if(hs[ha]==0)          //如果该哈希值还未出现过
34       {
35         H[hn++]=ha;          //将该哈希值记录起来,同时哈希值数量加 1
36       }
37       sn++;                  //0 表示结尾,所以从1 开始存,原值数量加 1,特别针对 hs数组
38       S[sn]=s;               //将原值记录起来
39       next[sn]=hs[ha];       //原本原值记录位置
40       hs[ha]=sn;             //最新原值记录位置,如果从0 开始存,就无法判断此时是空还是1个值
41       //比如:5 和 10 有一样的哈希值 ,并且 5 和 10 先后加入 那么有:
42       //5 加入: next[1] = 0; hs[5] = 1; hs[5] 是哈希值为5 的头,表示第一个原值在1的位置
43       //10加入: next[2] = 1; hs[5] = 2; 表示第一个哈希值为5的在2,第二个在1,第三个不存在
44     }
45     int find(LL s)           //查找
46     {
47       int ha=abs(s)%Mod;     //计算哈希值
48       int k=hs[ha];          //头
49       while(k!=0)
50       {
51         if(S[k]==s) return k;//找到
52         k=next[k];           //下一个节点
53       }
54       return 0;              //表示没找到
55     }
56 };
57 int main()
58 {
59
60   return 0;
61 }
时间: 2024-11-05 21:40:16

手写哈希类的相关文章

HDU 5183 Negative and Positive (NP) (手写哈希)

题目链接:HDU 5183 Problem Description When given an array \((a_0,a_1,a_2,?a_{n?1})\) and an integer \(K\), you are expected to judge whether there is a pair \((i,j)(0≤i≤j<n)\) which makes that \(NP?sum(i,j)\) equals to \(K\) true. Here \(NP?sum(i,j)=a_i?

[Codevs 1230]元素查找(手写哈希表)

题目连接:http://codevs.cn/problem/1230/ 说白了就是要我们自己手写一个哈希表的数据结构来实现添加和查找功能,map也能直接过(我第一次写就是用map骗AC的) 提一下个人理解的哈希表的实现(下面说的是线性寻址法),如果有误还请各位大神不吝指教 用一个数组模拟哈希表,函数f(x)=数字x在哈希表中出现的下标的最小可能值,一般f(x)=x mod t,t就是哈希表的长度 下面就是一个哈希表的示例,如果遍历哈希表时指针走出了哈希表的终点,就进入起点重新遍历 对于每次向哈希

2019 上海网络赛G 手写哈希map+字符串hash

https://nanti.jisuanke.com/t/41415 因为对于询问$\sum |s|<=1e5$,因此$|s|$的种类数$<=\sqrt{1e5}$ 我们分组标记,就变成了$\sqrt{1e5}$次询问了,我们暴力去跑, 复杂度$1e5\sqrt{1e5}*hashmap$ 暴力+哈希+$unordermap$计数,嗯,果然TLE了 然后手写一个$hashmap$,跑的飞快... #include<bits/stdc++.h> #define ull unsigne

自学.net(1)手写一个sqlhelper类

自学.net已经快一个月了,看的是传智播客的视频,今天正好申请了博客,就先把手写的sqlhelper类上传上去吧 别忘了在解决方案管理器的“引用”添加System.Configuration 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Configuration; 6 using System.Data.SqlClient;

自己动手写Java String类

很早想造个轮子了,听说不想造轮子的程序员不是好程序员,用惯了Apache的众多开源项目,却没看过开源一句代码.最近看了几篇卖焦虑的文章之后,突然变得慌张起来,于是在百忙之中难得一点闲第一次打开了JDK的源码包.初读:晦涩难懂,3千多行代码,全英文注释,有一些陌生的语法和调用陌生的类足矣吓退一个中年程序员.再度:只读个轮廓,这String.class也就是注释写的全写得多,核心代码不多嘛!三读:哇喔,整个String类核心变量就一个char[]数组嘛: private final char val

手写SpringMVC 框架

手写SpringMVC框架 细嗅蔷薇 心有猛虎 背景:Spring 想必大家都听说过,可能现在更多流行的是Spring Boot 和Spring Cloud 框架:但是SpringMVC 作为一款实现了MVC 设计模式的web (表现层) 层框架,其高开发效率和高性能也是现在很多公司仍在采用的框架:除此之外,Spring 源码大师级的代码规范和设计思想都十分值得学习:退一步说,Spring Boot 框架底层也有很多Spring 的东西,而且面试的时候还会经常被问到SpringMVC 原理,一般

用BIO手写实现Redis客户端的探究(拒绝Jedis)

在Redis的使用过程中,大多数人都是使用现成的客户端,如Jedis,Redisson,Lettuce.因此本文研究用BIO的方式手写Redis客户端尝试,对遇到的问题进行探究及总结. 1.手写BIO调用类 使用BIO的方式进行Redis客户端的编写,首先定义一个Connection,Connection类包含了建立BIO连接的远程地址host,端口port,套接字Socket以及输入输出流. 此类一个Connection的构造方法,一个Connection的初始化方法,以及请求发送方法. pu

自己手写的自动完成js类

在web开发中,为了提高用户体验,会经常用到输入框的自动完成功能,不仅帮助用户进行快速输入,最重要的是帮助那些“记不全要输入什么”的用户进行选择.这个功能有很多插件已经实现了,为了适应项目的特殊需求,决定自己编写一个具备通用性.扩展性和灵活性的自动完成类,就当是边写边学习了,一举两得.该功能是比较简单的,核心是数据获取方式和导航的实现,简单写了一个,经测试非常好用,还有很多地方需要修改和改进,例如:在原型中只暴露init方法即可,其他方法都需要放到私有空间内,不让用户访问到,这个以后再完善吧.啥

关于java写一个单例类(面试手写题)

package com.shundong.javacore; /** * java写一个简单的单例类 * @author shundong * */ class Singleton { //使用一个类变量来缓存曾经创建的实例 private static Singleton instance; //对构造进行隐藏(private) private Singleton(){} /** * 提供一个静态方法 * 该方法加入了自定义控制 保证只产生一个Singleton对象 * @return 返回S