数据结构-散列(1)

一、散列表(Hash table)

1、散列表用来表示集合和字典,通过散列函数建立从元素关键码集合到散列表地址集合的一个映射,搜索时可以直接到达或者逼近具有对应关键码的元素的实际存放地址;

2、散列函数是压缩映像函数,关键码集合比散列表地址集合大得多,所以经过散列函数的计算会把不同的关键码映射到同一个散列地址上,散列地址相同的不同关键码互为同义词;

3、构造散列函数的要求:

  (1)、定义域必须包括需要存储的全部关键码,若散列表允许有m个地址则其值域必须在0到m-1之间;

  (2)、散列函数计算出来的地址能均匀分布在整个地址空间中;

  (3)、尽量简单,能在较短时间内计算出结果;

二、散列方法

1、除留余数法:

思想:设散列表中允许的地址数为m,取一个不大于m但最接近于或等于m的质数p(p不接近2的幂)作为除数,利用公式将关键码转换为散列地址;

转换公式:

    hash(key) = key%p      (p<=m && p为质数 && p不接近2的幂次);

注意:若选p为2的幂次,则散列函数hash(key)计算出来的地址就是key的低n位二进位数字;若key为十进制数且取p为10的幂次,则散列函数hash(key)计算出来的地址就是key的低n位数字;总而言之,在key为R进制数的条件下,避免选取p为R的幂次,否则会因为地址分布太集中而导致冲突增多;

2、数字分析法:

思想:设有n个d位数,每个数的每一位可能有r种不同的符号;对这n个数整体而言(可看做n行d列的位矩阵),r种不同符号在各位上出现的几率不尽相同,可能在某些位上每种符号出现的机会均等,可能在某些位上只有某几种符号经常出现;可根据散列表的大小选取其中各种符号分布均匀的若干位作为散列地址;

适用范围:必须事先知道关键码并明确所有关键码每一位数值的分布情况,换一个关键码集合就必须重新计算;

计算各位数字中符号分布的均匀度的公式:

    yk = (a1k-n/r)2+(a2k-n/r)2+...+(ark-n/r)2

  其中,aik表示第i个符号在第k位上出现的次数(注意不是次幂!!!),n/r表示各种符号在n个数中均匀出现的期望值,计算结果越小表明在该位上各种符号分布得越均匀;

例子:

          9  4  2  1  4  8

          9  4  1  2  6  9

          9  4  0  5  2  7

          9  4  1  6  3  0

          9  4  1  8  0  5

          9  4  1  5  5  8

          9  4  2  0  4  7

          9  4  0  0  0  1

         ——————————

   位标记:   1  2  3  4  5  6

一共有8个数,每个数6位,所以n=8且d=6;容易验证不同的符号个数r=10;

1位:仅有9出现且出现8次,所以y1=(8-8/10)2+(0-8/10)2*9=56.60;

2位:仅有4出现且出现8次,所以y2=(8-8/10)2+(0-8/10)2*9=56.60;

3位:2出现2次,1出现4次,0出现2次,有7种符号没有出现,所以y3=(2-8/10)2+(4-8/10)2+(2-8/10)2+(0-8/10)2*7=16.60;

...... 依次类推,计算可得y4 =y5=y6=5.60;

根据上述计算结果,若散列表地址范围有3位数字,则取各关键码的第4、5、6位作为记录的散列地址;

-------------------------------------------------------------------------------------------------------------------------------------------------------

夜深了,平方取中法、折叠法以及处理冲突的闭散列方法将在后续的散列笔记中介绍~

时间: 2024-12-28 08:23:06

数据结构-散列(1)的相关文章

数据结构——散列(一)

二叉树提供了对一组数据进行各种操作的强大功能,特别是在处理有序数据时二叉查找树非常方便.例如FindMax和FindMin操作,在表数据结构中这两个操作时间复杂度为O(N),但在二叉查找树中这两个操作只需要O(logN)的时间复杂度.但在很多情况下,数据的顺序并不是应用所关心的问题.这一类应用只需要插入,删除,查找这些基本的操作,此时使用二叉树数据结构进行这些操作的时间复杂度也为O(logN),当数据量很大时,这样的操作非常耗时.为了解决这个问题,提出了一种可以在常数时间复杂度情况下进行插入,删

数据结构--散列排序--散列表

散列表 散列查找,我们又回到了查找, 编译的时候,涉及变量及属性的管理: 插入:新变量的定义 查找:变量的引用 实际上是动态查找问题,查找树AVL树. 两个变量名(字符串)比较效率不高.字符串的比较要一个一个的比下去,时间会比较长, 是否可以把字符串转换成数字,再处理,就快多了.就是散列查找的思想. 已知的查找方法: 顺序查找                                          O(N) 二分查找(静态查找,不适合动态查找)   O(log2N) 二叉搜索数    

常见基本数据结构——散列

散列表的实现通常叫做散列.散列是一种用于以常数平均时间执行插入.删除和查找的技术.但是任何排序的信息都不会得到有效的支持.所以FindMax(),FindMin(),以及以线性时间打印的操作都是散列所不支持的. 理想的散列表数据结构值不过是一个包含有关键字的具有固定大小的数组. 关键字映射的函数叫做散列函数,通常散列函数应该运算简单并且保证任何两个不同的关键字映射到不同的单元.不过这是不可能的,因为单元的数目是有限的,然而关键字是用不完的.因此,我们寻找一个散列函数,该函数要在单元之间均匀的分配

数据结构--散列(分离链接法解决冲突)

散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存入到此存储单元中.检索时,用同样的方法计算地址,然后到相应的 单元里去取要找的结点.通过散列方法可以对结点进行快速检索.散列(hash,也称"哈希")是一种重要的存储方式,也是一种常见的检索方法. 因此,散列函数更像是一种映射,散列函数的选择有很多种,下面以散列函数为关键值对10取余为例,说明散列的插入关键

数据结构-散列查找

判断题 1.将M个元素存入用长度为S的数组表示的散列表,则该表的装填因子为M/S. T      F 2.在散列中,函数"插入"和"查找"具有同样的时间复杂度. T      F 3.在散列表中,所谓同义词就是被不同散列函数映射到同一地址的两个元素. T      F 4.采用平方探测冲突解决策略(hi(k)=(H(k)+i2)%11, 注意:不是±i2),将一批散列值均等于2的对象连续插入一个大小为11的散列表中,那么第4个对象一定位于下标为0的位置. T    

【数据结构】之散列链表(Java语言描述)

散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为"散列链表"?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的是一个数组: transient Node<K,V>[] table; ,数组中的每个元素都是一个 Node 对象.这里的Node是HashMap的一个内部类,代码如下: static class Node<K,V> implements Map.Entry<

算法导论笔记——第十~十一章 数据结构(一) 散列

第十章 基本数据结构 栈:可由数组表示 队列:可由数组表示 指针和对象:可由多数组表示.可用栈表示free list 有根数: 二叉树:左右孩子 分支无限制:左孩子右兄弟表示法 第十一章 散列表 数组:为每个元素保留一个位置 散列表:用于实际存储关键字比全部可能关键字少很多时,比如字典操作 解决散列冲突:链接法,开放寻址法 11.2 散列表 用链表法,在简单均匀散列的假设下,一次成功或不成功的查找所需要的平均时间为Θ(1+α),α为load factor. 11.3 散列函数 好的散列函数应(近

数据结构与算法分析java——散列

1. 散列的概念 散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存入到此存储单元中.检索时,用同样的方法计算地址,然后到相应的单元里去取要找的结点.通过散列方法可以对结点进行快速检索.散列(hash,也称“哈希”)是一种重要的存储方式,也是一种常见的检索方法. 按散列存储方式构造的存储结构称为散列表(hash table).散列表中的一个位置称为槽(slot).散

野生前端的数据结构基础练习(5)——散列

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Hash 散列的基本知识 定义 哈希表是一种根据关键码去寻找值的数据映射结构,最直观的应用就是字典(现实的字典,不是数据结构的字典概念). 特点: 插入,删除,取用较快,查找较慢(例如查询最值,需要借助其他数据结构来提升效率). 散列函数应