当前位置: 首页 > news >正文

算法导论笔记4:散列数 hash

了解一些散列的基本概念,仅从文字角度,整理了最基础的定义。

发现一本书,《算法图解》,微信读书APP可读,有图,并且是科普性质的读物,用的比喻很生活化,可以与《算法导论》合并起来看,会轻松很多。

在这里插入图片描述

P142散列数 hash table 槽 slot 对应全域中一个关键字
两个关键字映射到同一个槽里:冲突
散列,本质就是把任意长度的输入通过散列算法变成固定长度的输入,你可以理解为它是一种压缩性的映射,所以散列值的空间会小于输入空间,便于储存。
又因为它很难找到逆向规律的特性,所以也可以用作数字签名来保障数据传递的安全性,散列也称为哈希(Hash),hash算法也因此被广泛应用在互联网应用中。
散列表的基本概念
假设某应用要用到一个动态集合,其中每个元素都有一个属于[0…p]的关键字,此处p是一个不太大的数,且没有两个元素具有相同的关键字,则可以用一个数组[p+1]存储该动态集合,并且使用关键字作为数组下标进行直接寻址。这一直接寻址思想在前面的非比较排序中就有所应用。然而,当p很大并且实际要存储的动态集合大小n<<p时,这样一个数组将浪费大部分空间。< p=“”></p时,这样一个数组将浪费大部分空间。<>
散列表(Hash table),使用具有m个槽位的数组来存储大小为n的动态集合。α=n/m被定义为散列表的装载因子。在散列表中,具有关键字k的元素的下标为h(k),即利用散列函数h,根据关键字k计算出槽的位置。散列函数h将关键字域[0…p]映射到散列表[0…m-1]的槽位上,这里,m可以远小于p,从而缩小了需要处理的下标范围,并相应地降低了空间开销。散列表带来的问题是:两个关键字可能映射到同一个槽上,这种情形称为碰撞。因此,散列函数h应当将每个关键字等可能地散列到m个槽位的任何一个中去,并与其它关键字已被散列到哪一个槽位中无关,从而避免或者至少最小化碰撞

散列冲突解决方案

  1. 开放寻址法
    开放寻址法的核心思想是,如果出现了散列冲突,我们就重新探测一个空闲的位置。
    开放寻址法解决方案有线性探测法、二次探测、双重散列等方案:
    线性探测法(Linear Probing):1)插入数据:当我们往散列表中插入数据时,如果某个数据经过散列函数之后,存储的位置已经被占用了,我们就从当前位置开始,依次往后查找(到底后从头开始),看是否有空闲位置,直到找到为止。

2)查找数据:我们通过散列函数求出要查找元素的键值对应的散列值,然后比较数组中下标为散列值的元素和要查找的元素是否相等,若相等,则说明就是我们要查找的元素;否则,就顺序往后依次查找。如果遍历到数组的空闲位置还未找到,就说明要查找的元素并没有在散列表中。
当然这里存在一个问题,就是存数据那块位置往前的某个数据被删除了,那么线性探索查到那块位置的时候就会判断元素不在散列表,查找就会失效,面对这个问题,我们在删除的时候,用下面删除的方法

P156完全散列 perfect hashing 关键字集合是静态 像CD-ROM一样存入不可变 马尔可夫不等式 摊还期望时间
全域散列,它在任意输入的情况下都能达到比较好的平均情况性能。但值得注意的是“平均情况性能”这六个字,就像BFPRT——Top k问题的终极解法一文中介绍的随机快速选择算法一样,虽然很难遇到导致最坏情况发生的输入,但这种可能性仍然是存在的,没有完全消除。我们需要继续追寻,找到像BFPRT一样,能在确定情况下提供出色的最坏情况性能的散列算法。
完全散列算法给出了关键字集合为静态时的解决方案。我们来看看它如何在最坏情况下达到 O(1) 的时间复杂度。最直接的想法,让散列数组的长度 m 尽量大,因为对于固定的关键字集合, m 越大,冲突的可能性就越低。但是,无论 m 取多大的数,冲突的可能性都不会降到0,只会越来越接近0。此时,静态关键字集合的好处就出来了,当冲突的可能性较低时,我们可以多试几个散列函数,找到不发生冲突的那个,确定为最终使用的散列函数。

FPGA与散列数相关的应用举例:
安全散列算法SHA(Secure Hash Algorithm,SHA)是美国国家标准和技术局发布的国家标准FIPS PUB 180-1,般称为SHA-1。其可对长度不超过264位的消息产生160位的消息摘要输出,可在NIST的网站上获得该算法的数学原理。IFF(Identification Friend or Foe, IFF)用于确定输入密钥是否正确。

其工作方式如下:

①在FPGA内部构造随机数生成模块,用于产生消息Q,并通过1-Wire总线发送DS2432芯片

②DS2432内部拥有一个由设计者设定的密钥。由该密钥并结合

③与此同时,FPGA内部产生一个期望的响应E,判断该期望响应是否与DS2432的真实响应A一致

④如果E与A吻合,则判断该设计为正版设计;否则判定为盗版设计;

⑤最终,FPGA程序可以对盗版设计做出程序锁止或减少功能。

相关文章:

算法导论笔记4:散列数 hash

一 了解一些散列的基本概念&#xff0c;仅从文字角度&#xff0c;整理了最基础的定义。 发现一本书&#xff0c;《算法图解》&#xff0c;微信读书APP可读&#xff0c;有图&#xff0c;并且是科普性质的读物&#xff0c;用的比喻很生活化&#xff0c;可以与《算法导论》合并起…...

知识蒸馏概述及开源项目推荐

文章目录 1.介绍2.知识2.1 基于响应的知识&#xff08;response-based&#xff09;2.2 基于特征的知识(feature-based)2.3 基于关系的知识(relation-based) 3.蒸馏机制3.1 离线蒸馏3.2 在线蒸馏3.3 自蒸馏 4.教师-学生架构5.蒸馏算法5.1 对抗性蒸馏&#xff08;Adversarial Dis…...

jupyter notebook中markdown改变图像大小

文章目录 &#x1f56e;原始图像&#x1f56e;改变图像大小&#x1f56e;使图像靠左 在 jupyter notebook中&#xff0c;导入的图片过大&#xff0c;想要改变图像的大小 &#x1f56e;原始图像 &#x1f56e;改变图像大小 复制小括号里面的内容到src后面&#xff0c;满足<…...

SpringGateWay——yml文件配置详解

Spring Gateway 是一个基于 Spring 框架的网关服务&#xff0c;主要作用是将流量路由到不同的微服务中。它的灵活性和可扩展性使它成为构建云原生应用架构的不二之选。 下面是 Spring Gateway 的 yml 文件配置参数详解&#xff1a; spring:cloud: gateway: routes: # 路由相…...

Haproxy实现七层负载均衡

目录 Haproxy概述 haproxy算法&#xff1a; Haproxy实现七层负载 ①部署nginx-server测试页面 ②(主/备)部署负载均衡器 ③部署keepalived高可用 ④增加对haproxy健康检查 ⑤测试 Haproxy概述 haproxy---主要是做负载均衡的7层&#xff0c;也可以做4层负载均衡 apache也可…...

k8s最详细集群部署

安装kubeadm、kubectl、和 kubelet 这里通过百度网盘下载所需要的安装包&#xff1a; 链接: k8s部署包.zip_免费高速下载|百度网盘-分享无限制 提取码: 0000 1、下载部署包到本地后&#xff0c;在k8s部署包/k8s目录下 执行此yum命令安装&#xff1a;yum localinstall ./*.r…...

Redis底层数据结构:字典

在 Redis 中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种常用的底层数据结构&#xff0c;它被用于实现 Redis 的哈希表&#xff08;Hash Table&#xff09;数据结构。字典用于存储键值对&#xff0c;它提供了快速的键值查找、插入和删除操作。 Redis 字典的特点&…...

upload 文件自动上传写法,前后端 下载流文件流

<el-uploadv-model:file-list"fileList":action"app.api/student/student/import":headers"{// Content-Type: multipart/form-data;boundary----split-boundary, 此处切记不要加&#xff0c;否则会造成后端报错 Required request part file is…...

Python文件、文件夹操作汇总

目录 一、概览 二、文件操作 2.1 文件的打开、关闭 2.2 文件级操作 2.3 文件内容的操作 三、文件夹操作 四、常用技巧 五、常见使用场景 5.1 查找指定类型文件 5.2 查找指定名称的文件 5.3 查找指定名称的文件夹 5.4 指定路径查找包含指定内容的文件 一、概览 ​在…...

CHM Viewer Star 6.3.2(CHM文件阅读)

CHM Viewer Star 是一款适用于 Mac 平台的 CHM 文件阅读器软件&#xff0c;支持本地和远程 CHM 文件的打开和查看。它提供了直观易用的界面设计&#xff0c;支持多种浏览模式&#xff0c;如书籍模式、缩略图模式和文本模式等&#xff0c;并提供了丰富的功能和工具&#xff0c;如…...

【GIT】git分支命令,使用分支场景介绍git标签介绍,git标签命令,git标签使用的场景git查看提交历史

目录 一&#xff0c;git分支命令&#xff0c;使用分支场景介绍 二&#xff0c;git标签介绍&#xff0c;git标签命令&#xff0c;git标签使用的场景 三&#xff0c;git查看提交历史 前言&#xff1a; 今天我们来聊聊关于Git 分支管理。几乎每一种版本控制系统都以某种形式支持…...

Zeitgeist ZTG Token以及其预测市场加入Moonbeam生态

波卡上的首选多链开发平台Moonbeam宣布与Zeitgeist达成XCM集成&#xff0c;将ZTG Token引入Moonbeam。此集成将使波卡内的Moonbeam和Zeitgeist网络之间的流动性得以流动&#xff0c;并通过Moonbeam的互连合约实现远程链集成。 Zeitgeist是一个基于波卡的Substrate区块链框架构…...

AM@方向导数概念和定理

文章目录 abstract方向导数二元函数方向导数偏导数是方向导数的特例偏导数存在一定有对应的方向导数存在方向导数存在不一定有偏导数存在例 三元函数方向导数例 方向导数存在定理和计算公式证明二元函数三元函数 abstract 方向导数的概念,定理和计算公式方向导数是对偏导的补充…...

微信小程序隐私政策不合规,应当由用户自主阅读后自行选择是否同意隐私政策协议,不得默认强制用户同意

小程序隐私政策不合规&#xff0c;默认自动同意《用户服务协议》及《隐私政策》&#xff0c;应当由用户自主阅读后自行选择是否同意隐私政策协议&#xff0c;不得默认强制用户同意&#xff0c;请整改后再重新提交。 把 登录代表同意《用户协议》和《隐私政策》 改为 同意《用…...

Python中如何判断两个对象的内存地址是否一致?

目录 一、引言 二、Python的内存管理 三、对象的比较 四、使用id函数判断内存地址 五、总结 一、引言 在Python中&#xff0c;我们经常需要比较两个对象是否是同一个对象&#xff0c;或者说它们是否在内存中占据同一位置。在理解这个问题之前&#xff0c;我们需要了解Pyt…...

唯美仙侠3D手游2023【仙变3】画面精美/linux服务端+双端+GM后台+运营后台+详细教程

搭建资源下载地址&#xff1a;https://www.ldmzy.com/6618/6618.html...

React组件通信:如何优雅地实现组件间的数据传递

在React应用中&#xff0c;组件通信是至关重要的一部分。通过合适的数据传递和交互方式&#xff0c;我们可以构建出更加灵活和高效的前端应用。本文将介绍React组件通信的各种方式&#xff0c;并提供代码实现&#xff0c;帮助你更好地理解和应用这些技术。 1. 使用props进行父子…...

数据分析实战 | 逻辑回归——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接&#xff1a;https://download.csdn.net/d…...

Eigen::Matrix<double,3,1> F;Eigen::MatrixXd F (3, 2);这两行代码有什么区别?

这两行代码的区别在于定义的矩阵 F 的类型和维度不同。 第一行&#xff1a; Eigen::Matrix<double,3,1> F;这行代码创建了一个3x1的矩阵 F&#xff0c;其中元素类型为 double。这是一个静态大小的矩阵&#xff0c;其维度在编译时确定。 第二行&#xff1a; Eigen::Ma…...

Java Agent - 应用程序代理-笔记

Java Agent - 应用程序代理-笔记 概述说明 Java Agent 又叫做 Java 探针&#xff0c;该功能是 Java 虚拟机提供的一整套后门&#xff0c;通过这套后门可以对虚拟机方方面面进行监控与分析&#xff0c;甚至干预虚拟机的运行。 是在 JDK1.5 引入的一种可以动态修改 Java 字节码…...

智驾公司生死线 | 端到端是面子,含模量是里子

点击下方卡片&#xff0c;关注“自动驾驶之心”公众号戳我-> 领取自动驾驶近30个方向学习路线作者 | 圆周智行编辑 | 自动驾驶之心原文 | 端到端是面子&#xff0c;含模量是里子——智驾公司的生死线>>自动驾驶前沿信息获取→自动驾驶之心知识星球★谁在真正进化&…...

__block 变量内存布局详解什

故障表现 发现请求集群 demo 入口时卡住&#xff0c;并且对应 Pod 没有新的日志输出 rootce-demo-1:~# kubectl get pods -n deepflow-otel-spring-demo -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NO…...

2025届最火的五大AI写作工具实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 免费的AI论文工具&#xff0c;给学术写作送去了高效的解决办法&#xff0c;这般的软件大幅借…...

Qt网格布局实战:从入门到精通

1. Qt网格布局基础入门 第一次接触Qt网格布局时&#xff0c;我完全被它的灵活性震惊了。想象一下Excel表格&#xff0c;每个单元格可以自由合并拆分&#xff0c;这就是QGridLayout给我的直观感受。作为Qt中最强大的布局管理器之一&#xff0c;它能够将界面元素精准地放置在网格…...

Delphi XE跨平台开发实战:Linux服务端应用构建指南

1. 为什么选择Delphi XE开发Linux服务端应用 作为一个在Windows平台深耕多年的Delphi开发者&#xff0c;当我第一次听说Delphi XE支持Linux开发时&#xff0c;内心是充满怀疑的。毕竟Linux开发环境向来以命令行和开源工具链著称&#xff0c;而Delphi给我的印象一直是可视化开发…...

终极指南:如何使用BOTW存档编辑器定制你的海拉鲁冒险

终极指南&#xff1a;如何使用BOTW存档编辑器定制你的海拉鲁冒险 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 你是否曾在《塞尔达传说&#xff1a;旷野之息》的…...

RK3562J与MCP2518FD通信测试全记录:从双板互发数据到常见错误分析

RK3562J与MCP2518FD通信实战&#xff1a;从双板互发到异常诊断全解析 当两块开发板通过CAN-FD总线成功交换数据的瞬间&#xff0c;那种"灯亮起来"的成就感是嵌入式开发者独有的快乐。RK3562J作为瑞芯微新一代工业级处理器&#xff0c;其与MCP2518FD的组合在车载诊断、…...

BME680气体校准优化:如何将IAQ校准时间从1小时缩短到10分钟?

BME680气体校准优化实战&#xff1a;从1小时到10分钟的高效策略 第一次接触BME680传感器的开发者&#xff0c;往往会被它长达1小时的气体校准时间震惊。在医疗消毒设备实时监测、智能新风系统快速响应等场景中&#xff0c;这种等待简直是奢侈。但通过深入分析BSEC库的state机制…...

仅限头部AI平台内部流出的配额审计清单:覆盖Token级计量、跨模型共享配额、突发流量信用额度等8项稀缺机制

第一章&#xff1a;大模型工程化限流与配额管理 2026奇点智能技术大会(https://ml-summit.org) 在大规模语言模型服务化落地过程中&#xff0c;限流与配额管理是保障系统稳定性、公平性与商业可持续性的核心工程能力。当数百个业务方共享同一套推理集群时&#xff0c;突发流量…...

告别环境冲突!用Anaconda虚拟环境搞定QGIS 3.18二次开发(附Pycharm代码补全修复)

告别环境冲突&#xff01;用Anaconda虚拟环境搞定QGIS 3.18二次开发&#xff08;附Pycharm代码补全修复&#xff09; 当你在深夜调试QGIS插件时&#xff0c;突然发现昨天还能运行的脚本今天报了一堆依赖错误——这种场景对GIS开发者来说再熟悉不过了。环境冲突、版本不匹配、ID…...