#哈希# ----- 哈希表初学

哈希表

哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。

对不同的关键字可能得到同一散列地址,即k1≠k2,而f(k1)=f(k2),这种现象称为碰撞(英语:Collision)。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数f(k)和处理碰撞的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为散列表,这一映射过程称为散列造表或散列,所得的存储位置称散列地址。

查找:

1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。若其中H(key)中已经有值    了,就往下一个找,直到H(key)中没有值了,就放进去。

2. 数字分析法:分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示       月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列     地址。

3. 平方取中法:当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都       相关,故不同关键字会以较高的概率产生不同的哈希地址。

4. 折叠法:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。数位叠加可以有移位叠加和间界叠加两种方法。移位叠       加是将分割后的每一部分的最低位对齐,然后相加;间界叠加是从一端向另一端沿分割界来回折叠,然后对齐相加。

5. 随机数法:选择一随机函数,取关键字的随机值作为散列地址,通常用于关键字长度不同的场合。

6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之     后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。

输入n,输入数列An,再输入m个数查询是否在An内,在输出“YES”,否这输出“NO”。

 1 #include<cstdio>
 2 #define M 4194303
 3 int n,m,ans,cnt;
 4 int s[50005];
 5 int hashline[M+1];
 6 int next[12600005];//链
 7 int fline[12600005];//链上值
 8
 9 void insert (int x){//插入
10     int key=x%M;
11     fline[++cnt]=x;
12     next[cnt]=hashline[key];
13     hashline[key]=cnt;
14 }
15
16 bool find (int c){//查询
17     int key=c%M;
18     for(int i=hashline[key];i;i=next[i])
19         if(c==fline[i])return true;
20     return false;
21 }
22
23 int main(){
24     scanf("%d%d",&n,&m);
25     for(int i=1;i<=n;++i){
26         scanf("%d",&s[i]);
27         insert(s[i]);
28     }
29     for(int i=1;i<=n;++i){
30         int c;
31         scanf("%d",&c);
32         if(find(c))printf("YES\n");
33         else printf("NO\n");
34     }
35     return 0;
36 }

为减少冲撞,选好大质数M非常重要。

M={1000000007,1998585857,4194303}

时间: 2024-11-01 09:06:11

#哈希# ----- 哈希表初学的相关文章

redis哈希缓存数据表

REDIS HASH可以用来缓存数据表的数据,以后可以从REDIS内存数据库中读取数据. 从内存中取数,无疑是很快的. 1)将数据表中的数据写入REDIS缓存 Redis.cmd_HSET('table1', 'field1', '1'); Redis.cmd_HSET('table1', 'field2', '2'); 2)从REDIS获取缓存的数据表数据 procedure TForm1.Button2Click(Sender: TObject); var s, s2: string; be

哈希哈希

前言: 哈希表(Hash Table)也叫散列表,是一种用于快速存取的数据结构.其内部实现是通过把键(key)码映射到表中的一个位置来访问记录,其中的“映射”也就是哈希函数,而“表”即哈希表.本文将重点介绍实现哈希表的2种方法:拉链法和线性探测法. 1.实验数据 A 2C 1B 6B 11H 1J 3数据说明:为了跟前面博文保持一致,本文的数据依然采用键值对(Key-Value)的形式.哈希表中主要有"存"和"取"操作.前者为:void put(Key key,Va

CSS样式表初学,比C#和JS简单

今天咱们一起来看下CSS样式表的基本基础 经常看博客或者喜欢钻研代码这一类的人对CSS可能有所耳闻,但具体的可能不是很清楚 那什么是CSS呢?与HTML又有什么区别呢?今天咱们就来说道下这个CSS CSS:层叠式样式表 HTML:超文本标记语言 HTML是负责展示你的网页上都有什么内容,都有什么 CSS是负责你的网页上的内容都怎么摆布,什么样的格局 那CSS到底怎么用呢?布局用HTML中的table不久可以布局么,根据具体要求进行切割就行,没必要用CSS布局,很多人都会这么想 那我要是告诉你一种

深入浅出哈希表的用法

1.哈希表(Hash Table)也就散列表,是根据关键码值(key,value)而直接进行访问的数据结构.也就是说它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.2.给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数,也叫散列函数.

oracle表之间的连接之-----&gt;哈希连接(Hash Join)

哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 对于排序合并连接,如果两个表在施加了目标SQL中指定的谓词条件后得到的结果集很大而且需要排序,则排序合并连接的执行效率一定不高:而对于嵌套循环连接,如果驱动表所对应的驱动结果集的记录数很大,即便在被驱动表的连接列上存在索引,此时使用嵌套循环连接的执行效率也会同样不高.为了解决这个问题,于是ORACLE引进了哈希连接.在ORACLE 10g及其以后的版本中,优化器 (实际上是CBO,因为哈希连接仅

哈希表 hash table

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数. 首先问题规模确定,例如5台服务器怎么把数据散落在5台上面呢,就用到了hash算法

【STL】哈希表 uthash.h

散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构.线性表查找的时间复杂度为O(n)而平衡二叉树的查找的时间复杂度为O(log(n)).无论是采用线程表或是树进行存储,都面临面随着数据量的增大,查找速度将不同程度变慢的问题.而哈希表正好解决了这个问题. 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数 函

哈希表定义

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数. 哈希表的基本思想: 以线性表中的每个元素的关键字key为自变量,通过一定的函数关系

哈希表与哈希函数 C实现

<pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp"> <strong>散列表</strong>(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通