算法打基础——HashⅡ: 全域哈希与完美哈希

yizhihongxing

算法打基础——HashⅡ:全域哈希与完美哈希的完整攻略

本文将为您提供关于全域哈希和完美哈希的完整攻略,包括算法原理、步骤和示例。

全域哈希

全域哈希是一种哈希函数族,它可以在不知道输入数据分布的情况下,将输入数据映射到哈希表中的不同位置。全域哈希的特点是,对于任意两个不同的输入数据,它们被映射到同一个哈希表位置的概率非常小。

算法原理

全域哈希的原理是,将输入数据与随机生成的哈希函数进行组合,得到一个哈希值。由于哈希函数是随机生成的,因此对于不同的输入数据,它们被映射到同一个哈希表位置的概率非常小。

算法步骤

全域哈希的步骤如下:

  1. 随机生成一组哈希函数。

  2. 将输入数据与哈希函数进行组合,得到一个哈希值。

  3. 将哈希值映射到哈希表中的一个位置。

  4. 重复步骤2-3,直到所有输入数据都被映射到哈希表中的不同位置。

示例

以下是一个示例,演示了如何使用全域哈希将输入数据映射到哈希表中的不同位置。

假设有以下输入数据:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我们可以使用全域哈希将这些数据映射到哈希表中的不同位置。以下是步骤:

  1. 随机生成一组哈希函数。

h1(x) = (3x + 7) % 11
h2(x) = (5x + 11) % 13
h3(x) = (7x + 13) % 17

  1. 将输入数据与哈希函数进行组合,得到一个哈希值。

h1(1) = 10
h2(1) = 1
h3(1) = 14
h1(2) = 0
h2(2) = 8
h3(2) = 4
h1(3) = 9
h2(3) = 3
h3(3) = 15
h1(4) = 7
h2(4) = 6
h3(4) = 16
h1(5) = 6
h2(5) = 9
h3(5) = 0
h1(6) = 4
h2(6) = 12
h3(6) = 3
h1(7) = 2
h2(7) = 2
h3(7) = 10
h1(8) = 1
h2(8) = 5
h3(8) = 13
h1(9) = 11
h2(9) = 11
h3(9) = 1
h1(10) = 8
h2(10) = 1
h3(10) = 14

  1. 将哈希值映射到哈希表中的一个位置。

[10, 1, 14, 0, 8, 4, 9, 6, 16, 3, 15, 2, 11, 5, 13, 7, 12]

  1. 所有输入数据都被映射到哈希表中的不同位置。

完美哈希

完美哈希是一种哈希函数,它可以将输入数据映射到哈希表中的不同位置,且不会出现哈希冲突。完美哈希的特点是,对于已知的输入数据集合,它可以生成一个哈希函数,使得所有输入数据都被映射到哈希表中的不同位置。

算法原理

完美哈希的原理是,先使用全域哈希将输入数据映射到哈希表中的不同位置,然后再使用一个二次哈希函数对哈希表中的每个位置进行哈希,得到一个哈希值。由于二次哈希函数是根据已知的输入数据集合生成的,因此不会出现哈希冲突。

算法步骤

完美哈希的步骤如下:

  1. 使用全域哈希将输入数据映射到哈希表中的不同位置。

  2. 对哈希表中的每个位置使用一个二次哈希函数进行哈希,得到一个哈希值。

  3. 将哈希值映射到哈希表中的一个位置。

  4. 重复步骤2-3,直到所有输入数据都被映射到哈希表中的不同位置。

示例

以下是一个示例,演示了如何使用完美哈希将输入数据映射到哈希表中的不同位置。

假设有以下输入数据:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我们可以使用完美哈希将这些数据映射到哈希表中的不同位置。以下是步骤:

  1. 使用全域哈希将输入数据映射到哈希表中的不同位置。

[10, 1, 14, 0, 8, 4, 9, 6, 16, 3, 15, 2, 11, 5, 13, 7, 12]

  1. 对哈希表中的每个位置使用一个二次哈希函数进行哈希,得到一个哈希值。

h(x) = (3x^2 + 5x + 7) % 17
h(10) = 2
h(1) = 0
h(14) = 0
h(0) = 7
h(8) = 4
h(4) = 0
h(9) = 4
h(6) = 7
h(16) = 2
h(3) = 2
h(15) = 4
h(2) = 2
h(11) = 4
h(5) = 7
h(13) = 0
h(7) = 7
h(12) = 0

  1. 将哈希值映射到哈希表中的一个位置。

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  1. 所有输入数据都被映射到哈希表中的不同位置。

结论

全域哈希和完美哈希是两种常用的哈希函数,它们可以将输入数据映射到哈希表中的不同位置。全域哈希适用于不知道输入数据分布的情况下,而完美哈希适用于已知输入数据集合的情况下。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:算法打基础——HashⅡ: 全域哈希与完美哈希 - Python技术站

(0)
上一篇 2023年5月6日
下一篇 2023年5月6日

相关文章

  • 简单了解python变量的作用域

    简单了解Python变量的作用域 在Python中,变量的作用域指的是变量在程序中可访问的范围。了解变量的作用域对于编写可维护和可理解的代码非常重要。Python中有三种主要的变量作用域:全局作用域、局部作用域和嵌套作用域。 全局作用域 全局作用域是在整个程序中都可访问的作用域。在全局作用域中定义的变量可以在程序的任何地方使用。可以使用global关键字来在…

    other 2023年7月29日
    00
  • 微信公众平台如何获取用户的openid(一)

    微信公众平台如何获取用户的openid(一) 在开始介绍如何获取用户的openid之前,首先需要了解openid是什么。OpenID是一个基于OAuth 2.0授权协议的身份认证标准。在微信公众平台中,openid用于区分不同用户的身份,并且可以作为用户的唯一标识识别用户。 为了获取用户的openid,我们需要使用微信公众平台提供的网页授权机制。在网页授权机…

    其他 2023年3月28日
    00
  • UVa 297 Quadtrees(树的递归)

    下面是“UVa 297 Quadtrees(树的递归)”的完整攻略,包括题目描述、解题思路和两个示例等方面。 题目描述 给定两个四叉树,每个节点要么是黑色要么是白色。如果一个节点是白色,则它没有子节点;如果一个节点是黑色,则它有四个子节点,分别代表该节点的四个象限。现在要求将两个四叉树合并成一个四叉树,合并规则如下: 如果两个节点都是白色,则合并后的节点也是…

    other 2023年5月5日
    00
  • Sublime Text英文字母大小写怎么切换?

    Sublime Text英文字母大小写切换攻略 Sublime Text是一款功能强大的文本编辑器,提供了多种快捷键和功能来方便用户进行编辑操作。下面是关于如何在Sublime Text中切换英文字母大小写的详细攻略。 方法一:使用快捷键 Sublime Text提供了一组快捷键来快速切换英文字母的大小写。以下是常用的快捷键: 转换为大写:按下Ctrl + …

    other 2023年8月16日
    00
  • javascript图片延迟加载实现方法及思路

    下面我来详细讲解一下“javascript图片延迟加载实现方法及思路”的完整攻略。 什么是图片延迟加载 图片延迟加载(Lazy Load)是一种优化网页性能的技术,它可以延迟加载页面中的图片,使网页的加载速度更快,提升用户的体验。具体实现就是在网页中,把页面中的图片的真实地址存储在其他属性里,待页面加载完毕后,再通过 JavaScript 代码来获取并替换图…

    other 2023年6月25日
    00
  • win10系统不显示文件名和菜单项的两种解决方法

    下面我来详细讲解“win10系统不显示文件名和菜单项的两种解决方法”的完整攻略。本攻略分为以下两部分: 一、win10系统不显示文件名的解决方法 1. 打开文件夹选项- 在Windows资源管理器中,点击“查看”选项卡;- 然后在页面底部找到“选项”按钮,点击;- 弹出“文件夹选项”窗口后,点击“查看”选项卡;- 在列表中找到“隐藏已知文件类型的扩展名”选项…

    other 2023年6月26日
    00
  • C++基于EasyX框架实现飞机大战小游戏

    C++基于EasyX框架实现飞机大战小游戏攻略 介绍 本攻略将会详细介绍如何使用C++语言和EasyX图形库实现一个简单的飞机大战小游戏。EasyX是一个基于Windows GDI+的简单易用的图形库,轻松实现2D图形渲染。 准备工作 下载Visual Studio并安装(如果已安装则可跳过此步); 下载并解压EasyX图形库的压缩包,并将包含EasyX库源…

    other 2023年6月26日
    00
  • c#中dllimport用法

    C#中DllImport用法 在C#中,DllImport(Dynamic Link Library Import)是用来访问动态链接库(DLL)中导出函数的方法。DllImport通常用于调用在DLL中实现的非托管函数,它可以将C#中的方法定义和DLL中的函数定义连接起来。使用DllImport,我们可以方便地在C#中调用C或C++实现的代码。 声明Dll…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部