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. Git_远程仓库fork操作

    fork操作:当选择 fork,相当于自己有了一份原项目的拷贝,当然这个拷贝只是针对当时的项目文件,如果后续原项目文件发生改变,你必须通过其他的方式去同步. 使用场景:一般来说,不需要使用 fork ...

  2. 读HikariCP源码学Java(二)—— 因地制宜的改装版ArrayList:FastList

    前言 如前文所述,HikariCP为了提高性能不遗余力,其中一个比较特别的优化是它没有直接使用ArrayList,而是自己实现了FastList,因地制宜,让数组的读写性能都有了一定程度的提高. 构造 ...

  3. 【逆向&编程实战】Metasploit安卓载荷运行流程分析_复现meterpreter模块接管shell

    /QQ:3496925334 作者:MG193.7 CNBLOG博客号:ALDYS4 未经许可,禁止转载/ 关于metasploit的安卓模块,前几次的博客我已经写了相应的分析和工具 [Android ...

  4. 如何开启O2优化

    O2环境会使你的程序跑的特别快,然而大多数正式考试都不能开O2 然而平时做有些题强制开O2,会出现在本机运行正确,但是交上去RE的情况,这时你就要开O2了. 例如在本机运行时会有下标为-但可以运行,而 ...

  5. Python变量小秘密

    变量全都是引用 跟其他编程语言不同,Python的变量不是盒子,不会存储数据,它们只是引用,就像标签一样,贴在对象上面. 比如: >>> a = [1, 2, 3] >> ...

  6. WEB安全漏洞扫描与处理(下)——安全报告分析和漏洞处理

    1 AppScan生成的安全报告分析 利用AppScan生成安全报告,可以提前对要生成的安全报告的内容进行选择,如下图,最全的安全报告内容,包括摘要,安全性问题,咨询和修订建议,应用程序数据等. 生成 ...

  7. 20201123 《python程序设计》实验四报告

    20201123 2020-2021-2 <python程序设计>实验三报告 课程:<Python程序设计>班级:2011姓名:晏鹏捷学号:20201123实验教师:王志强实验 ...

  8. react 的优点

    1. 声明式开发 react 是声明式的开发方式,与之对应的是命令式开发方式.之前用jquery写代码的时候,我们都是直接操作dom,这种我们称为命令式的编程.命令式编程需要我们一点点的告诉dom,它 ...

  9. 第三方模块npm

    npm介绍 npm 全名 node package manager   node包管理工具,增删查改 如果npm操作太慢,可以安装npm镜像 npm的下载 比如全局下载一个jquery文件,全局下载的 ...

  10. js(if else)分数等级查询

    <!DOCTYPE html><html><head><meta charset="utf-8"><title>文档标题 ...