除留余数法介绍

除留余数法此方法为最常用的构造散列函数方法。对于散列表长为m的散列函数公式为:

f( key ) = key mod p ( p ≤ m )

mod是取模(求余数)的意思。事实上,这方法不仅可以对关键字直接取模,也可在折叠、平方取中后再取模。

一个例子

  • 很显然,本方法的关键就在于选择合适的p, p如果选得不好,就可能会容易产生同义词。下面我们来举个例子看看:

有一个关键字,它有12个记录,现在我们要针对它设计一个散列表。如果采用除留余数法,那么可以先尝试将散列函数设计为f(key) = key mod 12的方法。比如29 mod 12 = 5,所以它存储在下标为5的位置。

不过这也是存在冲突的可能的,因为12 = 2×6 = 3×4。如果关键字中有像18(3×6)、30(5×6)、42(7×6)等数字,它们的余数都为6,这就和78所对应的下标位置冲突了。

  • 甚至极端一些,对于下图的关键字,如果我们让p为12的话,就可能出现下面的情况,所有的关键字都得到了0这个地址数,这未免也太糟糕了点。

但是我们如果不选用p=12来做除留余数法,而选用p=ll,则结果如下:

这个时候就只有12和144有冲突,相对来说,就要好很多了。

如何合理选取p值

使用除留余数法的一个经验是,若散列表表长为m,通常p为小于或等于表长(最好接近m)的最小质数或不包含小于20质因子的合数。

  • 这句话怎么理解呢?要不这样吧,我再举个例子:某散列表的长度为100,散列函数H(k)=k%P,则P通常情况下最好选择哪个呢?A、91 B、93 C、97 D、99
  • 实践证明,当P取小于哈希表长的最大质数时,产生的哈希函数较好。我选97,因为它是离长度值最近的最大质数。

(4)散列函数设计:除留余数法相关推荐

  1. 数据结构 散列表 除留余数法 线性探测法解决冲突

    已知9名学生的信息,每个学生信息包括编号和姓名.学生信息为11,王红,22,刘军,47,王亮,92,张强,16,吴迪,3,李伟,7,赵磊,29,钱鹤,8,孙芳.用散列表实现以编号为关键码的查找.散列函 ...

  2. 散列函数设计:除留余数法

    散列函数设计:除留余数法 转载地址 感谢分享 除留余数法介绍 除留余数法此方法为最常用的构造散列函数方法.对于散列表长为m的散列函数公式为: f( key ) = key mod p ( p ≤ m ...

  3. 数据结构—— 构造散列函数的六种方法【直接定址法-数字分析法-平方取中法-折叠法-除留余数法-随机数法】

    目录: 一:直接定址法 二:数字分析法 三:平方取中法 四:折叠法 五:除留余数法 六:随机数法 这些方法原理都是将原来数字按某种规律变成另一个数字 一:直接定址法 取关键字的某个线性函数值作为散列地 ...

  4. 除留余数法构造哈希表_哈希表算法原理

    基本概念 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数. 哈 ...

  5. Hash(除留余数法+链地址法)

    //哈希函数:除留余数法 //处理冲突:链地址法 #include<stdio.h> #include<stdlib.h> #include<algorithm> ...

  6. 除留余数法构造哈希函数并用链地址法处理哈希冲突【C++实现】

    1.题目描述 哈希函数为H(key)=key%13,哈希冲突处理方法为:链地址法 c语言版数据结构上的例子 2.代码实现 首先建立一个哈希链表结点类HashNode,用于存放处理冲突时的关键字,其数据 ...

  7. 哈希函数 直接定址法 除留余数法

    直接定址法 直接定址法是以数据元素关键字k本身或它的线性函数作为它的哈希地址,即:H(k)=k  或 H(k)=a×k+b : (其中a,b为常数) 例1,有一个人口统计表,记录了从1岁到100岁的人 ...

  8. 【除留余数法定义hash函数+线性探测法解决hash冲突】数据结构实验之查找七:线性之哈希表

    Think: 1知识点:除留余数法定义hash函数+线性探测法解决hash冲突 数据结构实验之查找七:线性之哈希表 Time Limit: 1000MS Memory Limit: 65536KB P ...

  9. 使用散列表进行查找【查找关键词:电话号码,名称】【平方取中法,除留余数法】【开放地址探测法,公共溢出区法】【计算ASL】

    Library import pandas as pd import numpy as np import time 读取数据 df = pd.read_excel('重庆市印刷和记录媒介复制业754 ...

最新文章

  1. 【转】在python下使用包progressbar控制进度条
  2. LNMP,PHP开启openssl,功能扩展,K哥
  3. kibana操作elasticsearch:新增数据(随机生成id)
  4. Linux基础练习题(二)
  5. python编译2的n次方计算器_用PYTHON2做个计算器,哪位高手能用Python写出计算器的代码,需要加减乘除和退出,谢谢!...
  6. 深入理解python.md_从python角度,理解进程,线程,协程.md-Go语言中文社区
  7. CACHECLOUDV1.0慢日志定时任务创建流程分析
  8. Sublime Text3插件管理
  9. 全新UI多用户任务悬赏系统源码+带三级分销推广
  10. C语言电影院售票系统
  11. 计算机网络信息安全等级保护(等保)
  12. Excel分组数据、并创建多个新Excel文件
  13. 用大白话讲解Carplay(原创)
  14. 用40年前的电脑打开《花花公子》封面女郎图片,这可能吗?
  15. canvas画正六边形
  16. ctfshow 日志包含Web80-81
  17. [设计模式学习笔记] -- 策略模式
  18. 【ElenmentUI el-date-picker日期选择器,结束时间不得早于开始时间,且只能选择距开始时间指定天数的日期】
  19. 【java】查重类的实现
  20. mysql utl_file_pl/sql应用之利用utl_file写文件

热门文章

  1. 解决selenium连接driver报错Message: Can not connect to the Service chromedrive
  2. Linux按照行数、大小切分文件
  3. java页面代码下载_java 下载页面代码
  4. mysql连接查询on_MySql 连接查询中 on 和 where 的区别
  5. 计算机视觉开源代码集合(转载)
  6. Android浮窗权限研究(转载)
  7. 高阶篇:8.2)注塑模具讨论要点(讨模评审)
  8. Redis命令小细节
  9. pearson, kendall 和spearman三种相关分析方法的区别
  10. SQL2005 安装时 “性能监视器计数器要求(错误)” 解决方案