hash表/哈希表
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现