https://blog.csdn.net/duan19920101/article/details/51579136

简单理解就是一个通过映射直接查找的表(散列表),用哈希函数将数据按照其存储特点进行存储。查询效率接近是O(1)的。

存储方式是结合了数组和链表的思想,用链表将存储的数据直接相连,便于查询和修改。

其实就是一个储存优化的方式。

缺点

它是基于数组的,数组创建后难于扩展,某些哈希表被基本填满时,性能下降得非常严重,所以程序员必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。

构造

根据不同的数据特点有不同的构造方法:

https://blog.csdn.net/weixin_38169413/article/details/81612307

基本上就是解决冲突的方法不同。

开放地址法:

对于存储x,把他存到(x+i)%mod里。

i最开始等于零。如果冲突,就i++,重复直到找到空地址。mod大于数据大小并一般为质数。

eg:存名字和成绩按名字查询

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
struct stu{
string to;
int nxt,da;
}e[100];
int head[100000],cnt;
inline int hsh(string s)
{
int ln,hash=0,seed=31,t;//seed is a prime
int len=s.length();
for(int i=0;i<=len;i++)
{
hash=hash*seed+s[i];
hash%=99999;
}
t=head[hash];
while(t!=-1)
{
if(e[t].to==s)return t;
t==e[t].nxt;
}
if(t==-1)
{
e[++cnt]=(stu){s,head[hash],0};head[hash]=cnt;
t=cnt;
}
return t;
}
inline int findhsh(string s)
{
int ln,hash=0,seed=31,t;//seed is a prime
int len=s.length();
for(int i=0;i<=len;i++)
{
hash=hash*seed+s[i];
hash%=99999;
}
t=head[hash];
while(t!=-1)
{
if(e[t].to==s)return e[t].da;
t=e[t].nxt;
}
return t;
}
int main()
{
std::ios::sync_with_stdio(false);
memset(head,-1,sizeof head);
int n;
cin>>n;
string x;
int y,m,nn;
for(int i=1;i<=n;i++)
{
cin>>x>>y;
m=hsh(x);//地址
e[m].da=y;
}
cin>>nn;
for(int i=1;i<=nn;i++)
{
cin>>x;
cout<<findhsh(x)<<endl;
}
return 0;
}

hash表/哈希表的更多相关文章

  1. Hash之哈希表的详解

    Hash算法 Hash算法的原理; 决绝冲突的办法是: 线性探查法; 双散列函数法; 拉链法处理碰撞; 哈希原理及实现; 哈希表-Hash table, 也叫散列表;

  2. Redis常用操作-------Hash(哈希表)

    1.HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略. 在Redis2.4以下的版本里, HDEL 每次只能删除单个域,如果你需要在一 ...

  3. redis命令之 ----Hash(哈希表)

    HDEL HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略. HEXISTS HEXISTS key field 查看哈希表 key  ...

  4. 查找->动态查找表->哈希表

    文字描述 哈希表定义 在前面讨论的各种查找算法中,都是建立在“比较”的基础上.记录的关键字和记录在结构中的相对位置不存在确定的关系,查找的效率依赖于查找过程中所进行的比较次数.而理想的情况是希望不经过 ...

  5. 哈希表(散列表)—Hash表解决地址冲突 C语言实现

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...

  6. Redis哈希表总结

    本文及后续文章,Redis版本均是v3.2.8 在文章<Redis 数据结构之dict><Redis 数据结构之dict(2)>中,从代码层面做了简单理解.总感觉思路的不够条理 ...

  7. POJ 3349 Snowflake Snow Snowflakes (哈希表)

    题意:每片雪花有六瓣,给出n片雪花,六瓣花瓣的长度按顺时针或逆时针给出,判断其中有没有相同的雪花(六瓣花瓣的长度相同) 思路:如果直接遍历会超时,我试过.这里要用哈希表,哈希表的关键码key用六瓣花瓣 ...

  8. 哈希表的C实现(三)---传说中的暴雪版

    关于哈希表C实现,写了两篇学习笔记,不过似乎网上流传最具传奇色彩的莫过于暴雪公司的魔兽文件打包管理器里的hashTable的实现了:在冲突方面的处理方面,采用线性探测再散列.在添加和查找过程中进行了三 ...

  9. 菜鸟nginx源代码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)

      菜鸟nginx源代码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)   Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:B ...

随机推荐

  1. 尚硅谷Java——宋红康笔记【day25-day29】

    day25 Map接口 一.Map的实现类的结构: |----Map:双列数据,存储key-value对的数据 ---类似于高中的函数:y = f(x) |----HashMap:作为Map的主要实现 ...

  2. 纯小白干货:Java import以及Java类的搜索路径

    如果你希望使用Java包中的类,就必须先使用import语句导入.import语句与C语言中的 #include 有些类似,语法为:import package1[.package2-].classn ...

  3. NOIP模拟测试38「金·斯诺·赤」

    金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...

  4. 管理后台Vue

    管理后台 遇到的问题 搭建 基于vue 3.0 Vue CLI 4.x Ant Design Vue 2.0 搭建后台管理系统 Ant Design Vue 2.0 npm i --save ant- ...

  5. 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)

    [模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 \(n\),\(m\), ...

  6. BGV方案

    BGV方案 SIMD技术 中国剩余定理 在<孙子算经>中有这样一个问题:"今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物 ...

  7. 适合企业的CRM系统选型法则?

    在市场竞争激烈的今天,企业需要找到一款好用的企业CRM系统来帮助维护客户关系,同时也能够帮助企业进行销售管理.营销管理,CRM可以说是当代企业管理的最强工具之一.那么适合企业的CRM客户管理系统要如何 ...

  8. Cent OS下安装JDK11

    自己云服务器以前装了个JDK1.7,最近发现出了jdk11,所以修改一下JDK版本: 我这里用的是Xshell和XFtp工具,下载地址:https://www.netsarang.com/downlo ...

  9. bugku秋名山车神

    不断的刷新,发现表达式一直在变换,这种必须写脚本,才能跟上速度.直接上代码 import re import requests s=requests.session() r=s.get("h ...

  10. 二进制方式搭建Kubernetes集群

    环境准备: 演练暂时用单节点一台master和一台node节点来进行部署搭建(kubernetes 1.19版本) 角色 IP 组件 master 10.129.246.114 kube-apiser ...