Hash冲突解决——拉链法
来源:互联网 发布:数据库怎么加锁 编辑:程序博客网 时间:2024/05/13 14:24
本文略微讲解用静态链接表解决Hash冲突解决。
首先给出 n 以及 n 个字符串,要求储存并便于查找。
样例
输入
3 abcdefg gabcedf kajshdb
解析
先定义结构体:
struct node{ char str[100];//储存字符串 int next; //记录上一个结构体编号};node edge[1000];
我将使用一种很简单易冲突的Hash函数,见代码:
int Hash(char str[]){ int i,len,sum=0; len=strlen(str+1); for(i=1;i<=len;i++){ sum+=str[i]-'a'+1; } return sum%51;}
易得第一,第二字符串返回的Hash值都是28,发生冲突,可实际上在我看来,无论是否冲突,我们都可以使用静态链接表储存,例如str[]使用pre[Hash(str[])]储存。
如下代码:
void add(int val,char s[]){ //val是Hash返回值 edge[++edge_num].next=pre[val]; int len=strlen(s+1); for(int i=1;i<=len;i++) edge[edge_num].str[i]=s[i]; pre[val]=edge_num;} //静态链接表储存操作 for(int i=1;i<=n;i++){ scanf("%s",str[i]+1); int k=Hash(str[i]); add(k,str[i]); }
讲到这儿就差不多了
完整代码:
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int Hash(char str[]){ int i,len,sum=0; len=strlen(str+1); for(i=1;i<=len;i++){ sum+=str[i]-'a'+1; } return sum%51;}struct node{ char str[100]; int next;};node edge[1000];int pre[100],edge_num;void add(int val,char s[]){ edge[++edge_num].next=pre[val]; int len=strlen(s+1); for(int i=1;i<=len;i++) edge[edge_num].str[i]=s[i]; pre[val]=edge_num;}int main(){ int n; char str[100][100]; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",str[i]+1); int k=Hash(str[i]); add(k,str[i]); } for(int i=0;i<51;i++){ if(pre[i]!=0){ printf("Hash_num %d:",i); for(int j=pre[i];j!=0;j=edge[j].next){ for(int k=1;k<=strlen(edge[j].str+1);k++) printf("%c",edge[j].str[k]); if(edge[j].next!=0) printf("->"); } printf("\n"); } }}
样例输出结果
Hash_num 4:kajshdb Hash_num 28:gabcedf->abcdefg
代码有点丑,哎
阅读全文
1 1
- Hash冲突解决——拉链法
- hash表的拉链法解决冲突
- hash表拉链法解决冲突
- hash表之拉链法处理冲突
- 经典Hash实现(采用拉链法处理冲突)
- Hash表(拉链法)
- Hash开散列 拉链法
- php hash 拉链法
- 第7天:散列HASH(四)冲突解决办法之外部拉链法
- hashMap(一)——拉链法冲突处理与hashMap源码分析
- 哈希表查找 — 拉链法
- 浅谈数据结构——如何解决hash冲突
- hash(开放地址法解决冲突)
- hash之开放定址法解决冲突
- 解决hash冲突
- hash冲突解决
- 解决hash冲突
- Hash冲突解决
- 面向对象程序设计
- C++ 运算符 重载
- DAY31继承派生、组合、接口和抽象类
- EA&UML日拱一卒-活动图::CallOperationAction
- java多线程实现服务器端与多客户端之间的通信
- Hash冲突解决——拉链法
- 提高网页加载速度的方法
- Jenkins入门系列之——02第二章 Jenkins安装与配置
- python3 [爬虫入门实战] 爬虫之爬取盘多多文档(百万数据)
- 2017上
- 基于HTML5的五子棋游戏
- RxJava汇总--完善中。。。
- 【MyEclipse】设置JSP默认编辑器
- 2748: [HAOI2012]音量调节