美文网首页程序员
查找 - 计算式查找法 - 哈希法

查找 - 计算式查找法 - 哈希法

作者: Anoyi | 来源:发表于2018-03-14 13:44 被阅读0次

▶ 哈希函数的构造方法

> 数字分析法

假设关键字 Key 为 8 位十进制整数:

① 确定哈希表的长度,示例:100,即地址空间为 0 ~ 99

② 确定 “取值比较均匀分布” 的位置,示例:第四位和第七位

③ 则哈希函数为 H(Key) = H(ABCDEFGH) = DG

④ 示例: H(81301367) = 06、 H(81346532) = 43

> 平方取中法

假设关键字 Key 为大写英文字符串:

① 确定哈希表的长度,示例:1000,即地址空间为 0 ~ 999

② 指定内部编码,示例: A-01, B-02, C-03 。。。 Z-20

③ 计算内部编码平方,取中间三位作为哈希值

关键字 内部编码 内部编码的平方 H(Key)关键字的哈希地址
KEKA 11052501 122157 778 355001 778
KYAB 11250102 126564 795 010404 795
AKEY 01110525 001233 265 775625 315

> 分段叠加法

假设关键字 Key 为超长的整数,示例 12360324711202065 :

① 确定哈希表的长度,示例:1000,即地址空间为 0 ~ 999

② 从左到右,分割成 N 个三位数,右侧不足三位的舍弃,示例:123 603 247 112 020

③ 将 N 个三位数相加,结果超过三位数的左侧舍弃,示例:

H(Key) = H(12360324711202065) = 123 + 603 + 247 +112 + 020 = 1105 % 1000 = 105

> 除留余数法

假设哈希表长 m, p 为小于等于 m 的最大素数,哈希函数为:

H(Key) = k % p

示例:key 为 80, 表长 13,最大素数 13,H(Key) = H(80) = 80 % 13 = 5

> 伪随机数法

采用一个伪随机函数作为哈希函数, 即 H(key) = random(key)

▶ 处理冲突的方法

> 开放定址法(再散列法)

关键字 key 的初始哈希地址 h0 = H(key) 产生冲突时,以 h0 为基础,产生另一个地址 h1,若 h1 仍然冲突,再以 h0 为基础,产生哈希地址 h2,直到不冲突为止!

初始哈希地址:H0 = H(key)
冲突哈希地址:Hi = (H0 + Di) % m i = 1,2,...,n

① 线性探测再散列

Di = 1,2,3,...,m-1

② 二次探测再散列

Di = 1^2, -1^2, 2^2, -2^2,.... k^2, -k^2 (k <= m/2)

③ 伪随机探测再散列

Di = 伪随机数序列

查找结束条件:直到找到一个空单元或者查遍全表

> 再哈希法

同时构造多个不同的哈希函数,当哈希发生冲突时,使用下一个哈希函数,直到不再产生冲突。

这种方法不易产生聚焦,但增加了计算时间!

> 链地址法

产生的哈希冲突加入链表

▶ Java 中哈希值的计算规则

① 创建 int result,赋值非0

② 对于在 equals() 方法中测试的每个字段 f,通过以下方式计算哈希值 c

  • boolean: (f ? 0 : 1)
  • byte, char, shortint: (int)f
  • long: (int)(f ^ (f >>> 32))
  • float: Float.floatToIntBits(f)
  • double: Double.doubleToLongBits(f) 并像 long 型一样处理返回结果
  • object: 使用 hashCode() 方法,若为 null 返回 0
  • array: 将每个字段视为单独的元素并以递归方式计算哈希值,并按照下面所述方式组合最终结果

③ 组合哈希值 cresult

result = 37 * result + c

④ 返回 result

相关文章

  • 查找 - 计算式查找法 - 哈希法

    ▶ 哈希函数的构造方法 > 数字分析法 假设关键字 Key 为 8 位十进制整数: ① 确定哈希表的长度,示例:1...

  • 查找算法

    1.顺序查找法 改进后的顺序查找法 2.折半查找法 3.插值查找 插值查找其实是折半查找的升级版,在我们写折半查找...

  • 分治法

    1.查找技术 1)顺序表查找,一个一个的遍历下去比对查找就ok了。 2)可以使用哈希表查找。 3)二分法查找,每次...

  • 二分查找法

    二分查找法 二分查找法(递归)

  • 排序算法

    算法与数据结构基础 查找算法: 二分查找法: 简介:二分查找法又被称为折半查找法,用于预排序的查找问题 过程: 如...

  • [老实李] 算法初探:二分查找法 Binary Search

    二分查找法主要用来解决查找的问题 1、二分查找法Binary Search (注)对于有序数列才能使用二分查找法。...

  • 二分法查找

    二分法基本查找 二分法遍历查找

  • 查找算法

    查找算法 顺序查找法 时间复杂度:O(n) 二分法查找 二分法查找适用于有顺序的序列 时间复杂度:O(n) 核心思...

  • 查找算法

    三种查找算法:顺序查找,二分法查找(折半查找),分块查找,散列表

  • 二分查找法

    在有序数组中,查找特定元素的方法有许多种,今天和大家分享的是二分查找法,二分查找法,也可以称为对半查找,折半查找,...

网友评论

    本文标题:查找 - 计算式查找法 - 哈希法

    本文链接:https://www.haomeiwen.com/subject/zktnfftx.html