算法02哈希法

算法01之哈希法

  • 1.哈希法理论基础
    • 1.1哈希表
      • (1)哈希表
      • (2)哈希函数
      • (3)哈希碰撞
    • 1.2哈希法基本思想
    • 1.3哈希法适用场景与最常用的哈希结构
  • 2.LeetCode242:有效的字母异位词
    • (1)图解本题的哈希内核
    • (2)cpp代码
  • 3.LeetCode349:两个数组的交集
    • (1)图解本题哈希内核
    • (2)cpp代码
  • 4.LeetCode202:快乐数
  • 5.LeetCode1:1. 两数之和

1.哈希法理论基础

1.1哈希表

(1)哈希表

哈希表是一种数据结构,用于存储键值对(key-value pairs)。它通过将键(key)通过哈希函数映射到一个特定的索引位置来实现快速的数据访问。这个索引位置在内存中的数组或桶(buckets)中,使得在常数时间复杂度内可以进行查找、插入和删除操作。

想象一下你的家里有一个带有标签的抽屉。每个标签都对应着一个抽屉里的物品。当你需要某样东西时,你不必搜索整个房子,而是直接根据标签找到对应的抽屉,这就像哈希表根据键找到对应的数值一样。这种快速定位的方式使得你能够在瞬间找到你需要的物品,就像哈希表可以在常数时间内找到相应的值。

(2)哈希函数

哈希函数是一种将输入数据映射为固定长度散列值(哈希值)的函数。其主要目的是将任意长度的数据转换为固定长度的输出,通常是一个固定大小的数字或字节序列。

哈希函数具有以下特性:

  • 确定性: 相同的输入始终产生相同的哈希值。
  • 高效性: 计算速度快,能在合理时间内完成计算。
  • 离散性: 输入数据的微小变化应该导致输出哈希值的显著变化。
  • 不可逆性: 理论上不可通过哈希值逆向计算出原始输入数据。

常见的哈希函数有MD5、SHA-1、SHA-256等,它们被广泛用于数据加密、数据完整性验证、密码存储等领域。

想象你是一位魔术师,你有一个魔法箱子用来存放各种物品。你的目标是将每样物品放进箱子里,并在箱子的每个格子上放置一个标签。这个标签不仅告诉你物品存放在哪里,还得保证这个标签是独一无二的。你使用一个特殊的变化魔法(哈希函数),这个魔法会将每件物品都转化成一个独特的魔法标签,让你可以快速地找到它们。所以,当你需要取出某样物品时,你只需使用这个特殊魔法,它会让你知道这个物品的魔法标签,而这个标签对应着箱子的一个格子。这就好像哈希函数把数据变成一个特殊的“标签”,让你可以迅速找到存放的位置。而哈希函数的“魔法”在于,无论你放进去什么样的物品,它总是能给你一个独一无二的标签,就像每件物品都有一个特殊的魔法标签一样。

(3)哈希碰撞

在这里插入图片描述

哈希碰撞指的是不同的输入数据经过哈希函数计算后得到了相同的哈希值。在理想情况下,哈希函数应该能够将不同的输入映射到不同的哈希值,但在实际应用中,由于哈希函数将无限的输入空间映射到有限的输出空间,发生哈希碰撞是可能的。

想象一下你是一个魔术师,你的“蓝条”是有限的,当你的蓝条不足时,你的魔术可能会失灵而不准确。在你的魔法失效时,这就可能会发生原来是一个标签对应一个物品的情况而编程一个标签对应两个或两个以上的物品。“蓝条”就相当于是哈希表的存储空间,一个标签对应多个物品就是哈希碰撞

哈希冲突可以通过以下几种方法解决:

  • 开放寻址法(Open Addressing):这种方法在哈希冲突发生时,会寻找哈希表中的下一个可用位置,并尝试将数据存储在那里。这包括线性探测、二次探测、双重哈希等技术,逐个检查直到找到空槽来解决冲突。

在这里插入图片描述

  • 链表法(Chaining):哈希表中的每个槽位不只是一个单独的位置,而是一个链表或其他数据结构。当发生哈希冲突时,将新的键值对添加到该位置的链表中。这样,相同哈希值的元素都可以存储在同一个位置上,而不会发生覆盖。

在这里插入图片描述

  • 再哈希(Rehashing):当哈希表负载因子过高时,可以重新调整哈希表的大小,通常是增大容量,然后重新哈希所有的键值对到新的表中。这可以减少冲突的发生,因为新的更大的表提供了更多的空间来均匀分布键值对。

  • 完美哈希函数(Perfect Hashing):这是一种在特定情况下能够完全避免冲突的方法。完美哈希函数能够保证每个键都映射到不同的位置,但在实际中找到完美哈希函数可能比较困难。

选择哪种方法取决于应用的需求和数据特性。链表法在处理冲突时比较灵活,但需要更多的存储空间。开放寻址法则在空间效率上更高,但可能需要更多的探测步骤来解决冲突。再哈希和完美哈希函数则更多地关注于降低冲突的概率。

1.2哈希法基本思想

哈希法是一种基于哈希函数和哈希表的技术,用于将数据映射到一个固定范围的索引位置,以实现快速的查找、插入和删除操作。这个技术的核心是哈希函数,它将数据转换为哈希值,然后将该哈希值映射到哈希表中的特定位置。

1.3哈希法适用场景与最常用的哈希结构

在算法问题中,哈希法通常用于:

  • 快速查找: 哈希函数将数据映射为索引,使得在哈希表中能够以常数时间复杂度(O(1))进行查找操作。
  • 判断元素是否存在: 通过哈希表的结构,可以快速判断一个元素是否在集合中。
  • 去重操作: 将数据存储在哈希表中,可以自动去除重复元素,只保留唯一的元素。

2.LeetCode242:有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = “anagram”, t = “nagaram” 输出: true

示例 2:

输入: s = “rat”, t = “car” 输出: false

提示:

1 <= s.length, t.length <= 5 * 104 s 和 t 仅包含小写字母

(1)图解本题的哈希内核

在这里插入图片描述

(2)cpp代码

//在s中出现的一个字母,我们就增加其在OrccrenceWord中的值
//在t中出现该字母,我们就减少其在orccrenceWord中的值
//如果s和t字符串是有效字母的异位词,OrccurenceWord的每一项最后应该都是0
//因为对一组异位词,s对一个字母提供的正增量刚好等于t对一个字母提供的负增量
class Solution {
public:bool isAnagram(string s, string t) {int OrccrenceWord[26] = {0};for(int i: s){OrccrenceWord[i - 'a']++;}for(int i: t){OrccrenceWord[i - 'a']--;}for(int i = 0; i < 26; i++){if(OrccrenceWord[i] != 0){return false;}}return true;}
};

3.LeetCode349:两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的

提示:

1 <= nums1.length, nums2.length <= 1000 0 <= nums1[i], nums2[i] <=
1000

(1)图解本题哈希内核

在这里插入图片描述

(2)cpp代码

//unordered_set是一种常用的数据结构,适合在原数据规模很大或者原数据十分离散的情况
//unordered_set就像我们数学中的集合一样,满足两个主要特性:1.无需;2.不重复
//result存储结果
//nums1_set利用这个数据结构(类)的构造函数,哈希映射nums1,对齐进行去重
//遍历nums2,如果nums2中的元素在nums1中出现了,就把它插入到结果哈希表(result)中,最后返回结果哈希表
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result;unordered_set<int> nums1_set(nums1.begin(), nums1.end());for(int n: nums2){if(nums1_set.find(n) != nums1_set.end()){result.insert(n);}}return vector<int>(result.begin(), result.end()); }
};

4.LeetCode202:快乐数

5.LeetCode1:1. 两数之和

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

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

相关文章

《每天一分钟学习C语言·三》

1、 scanf的返回值由后面的参数决定scanf(“%d%d”,& a, &b); 如果a和b都被成功读入&#xff0c;那么scanf的返回值就是2如果只有a被成功读入&#xff0c;返回值为1如果a和b都未被成功读入&#xff0c;返回值为0 如果遇到错误或遇到end of file&#xff0c;返回值为EOF…

另一种理解伦敦金支撑阻力位的方法

支撑阻力位一向被认为是做伦敦金交易不可或缺的分析工具&#xff0c;但很多人对它的原理并不清楚&#xff0c;甚至不太服气&#xff0c;觉得凭什么一根平平无奇的水平位&#xff0c;能带来所谓的“大作用”呢&#xff1f;下面我们不妨从另外一个角度来看一下伦敦金市场中的支撑…

23、Web攻防——Python考点CTF与CMS-SSTI模板注入PYC反编译

文章目录 一、PYC文件二、SSTI 一、PYC文件 pyc文件&#xff1a;python文件编译后生成的字节码文件&#xff08;byte code&#xff09;&#xff0c;pyc文件经过python解释器最终会生成机器码运行。因此pyc文件是可以跨平台部署的&#xff0c;类似java的.class文件&#xff0c;…

金蝶EAS打印凭证,数据量多点的就会出错

金蝶EAS打印凭证&#xff0c;数据量多点的就会出错&#xff0c;约过100页&#xff0c;提示数据源有问题 经咨询工程师需修改java虚拟机内存。 打开eas客户端目录&#xff0c;运行set-url.bat 看到原来java虚拟机只配置了512M内存&#xff0c;把虚拟机内存修改为4096&#xff0…

如何解决苹果应用商城审核拒绝的Guideline 2.1 - Information Needed问题

当你的应用程序在苹果应用商城审核过程中被拒绝时&#xff0c;苹果会向您发送一封邮件&#xff0c;其中提供了关于拒绝原因的详细信息。本文将指导您如何正确处理Guideline 2.1 - Information Needed问题&#xff0c;并提供解决方案&#xff0c;以确保您的应用程序能够通过审核…

ansible的脚本—playbook剧本

一、playbook 1、简介 Playbook 剧本是由一个或多个play组成的列表。 play的主要功能在于将预定义的一组主机&#xff0c;装扮成事先通过ansible中的task定义好的角色。 Task实际是调用ansible的一个module&#xff0c;将多个play组织在一个playbook中&#xff0c;即可以让它…

系列十一(面试)、如何查看JVM的参数?

一、查看JVM的参数 1.1、概述 上篇文章介绍了JVM的参数类型&#xff0c;通过jinfo可以查看JVM的默认参数&#xff0c;本章介绍另外一种查看JVM参数的方式。 1.2、 分类 JVM中提供了三种方式查看JVM的参数信息&#xff0c;这三种方式又分为两类&#xff0c;即&#xff1a;查看默…

安防监控EasyCVR平台如何通过api接口设置实时流的sei数据实现画框等操作?

国标GB28181视频监控系统EasyCVR平台采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;能提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0…

(PC+WAP)装修设计公司网站模板 家装公司网站源码下载

(PCWAP)装修设计公司网站模板 家装公司网站源码下载 PbootCMS内核开发的网站模板&#xff0c;该模板适用于装修设计、家装公司类等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b; PCWAP&#xff0c;同一个后台&#xff0c…

贪吃蛇(一)

ncurses的使用 这是是用于改善用户交互的一个库&#xff0c;做到即时响应。 它的基本使用&#xff0c;涉及到两个函数initscr、endwin&#xff0c;涉及到键盘输入的交互&#xff0c;就需要使用到keypad函数。 基本用法 #include"curses.h" int main() {int key;in…

ubuntu推送本地仓库到coding

本教程提供在ubuntu系统下推送本地仓库到coding的指令&#xff0c;用于查阅 一、主要步骤有&#xff1a; 0.初始化仓库 git init 1.添加远程仓库 git remote add origin https://coding.git #修改自己仓库链接 &#xff08;命名仓库别名为origin&#xff09; 2.提交代码…

Ansible:模块2

1&#xff0c;command模块 一般用于执行linux的命令&#xff0c;不支持管道符和重定向。 2&#xff0c;shell模块 相当于command的升级版&#xff0c;也可以执行linux命令&#xff0c;支持管道符和重定向 3&#xff0c;cron 模块 在远程主机生成定时任务 分 时 日 月 周 m…

多级缓存:亿级流量的缓存方案

文章目录 一.多级缓存的引入二.JVM进程缓存三.Lua语法入门四.多级缓存1.OpenResty2.查询Tomcat3.Redis缓存预热4.查询Redis缓存5.Nginx本地缓存6.缓存同步 一.多级缓存的引入 传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未…

存储:windows 10 硬盘盒 新盘 SSD分区

1.准备好绿联2.5英寸 2.准备好 SSD 磁盘 3.接入硬盘和盒子 4.win10 电脑 win x 然后选择磁盘管理 &#xff08;磁盘管理 K&#xff09; 5.它会提示需要初始化的一个新的磁盘&#xff0c;确定初始化 6.添加卷 7.命名盘符 8.检测是否识别到盘符 9.end

【学习笔记】部署yolov8到安卓手机

一、环境配置和源码安装 首先你需要配置好pytorch环境&#xff0c;本文不再详细阐述&#xff0c;若未配置好环境&#xff0c;可以参考我的另一篇博客&#xff1a;https://blog.csdn.net/liujiahao123987/article/details/128743017 yolov8的安装可参考&#xff1a;https://blog…

【C语言 | 内存管理】野指针、静态区、堆、栈、常见的内存错误及对策

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【MATLAB源码-第101期】基于matlab的蝙蝠优化算BA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蝙蝠算法&#xff08;BA&#xff09;是一种基于群体智能的优化算法&#xff0c;灵感来源于蝙蝠捕食时的回声定位行为。这种算法模拟蝙蝠使用回声定位来探测猎物、避开障碍物的能力。在蝙蝠算法中&#xff0c;每只虚拟蝙蝠代表…

软件测试实现Finddler的手机抓包过程

Fiddler的手机抓包过程 1、启动Fiddler 打开菜单栏中的 Tools > Fiddler Options&#xff0c;打开“Fiddler Options”对话框&#xff1a; 2、在Fiddler Options”对话框 切换到“Connections”选项卡&#xff0c;然后勾选“Allow romote computers to connect”后面的复选…

UE5 C++(七)— UObject、UGameInstance实例化

文章目录 UObject实例化创建一个MyObject类在Default Pawn Class 中实现MyObject中参数调用 UGameInstance实例化创建GameInstance UObject实例化 创建一个MyObject类 在Default Pawn Class 中实现 注意&#xff1a;要实现运行时调用可在这里提前配置&#xff0c;具体参考之前…