算法学习(五)哈希表

哈希表

1. 概念

哈希函数也叫散列函数,它对不同的输出值得到一个固定长度的消息摘要。

1>散列结果应当具有同一性(输出值尽量均匀)

2>雪崩效应(微小的输入值变化使得输出值发生巨大的变化)

通常有以下几种构造 Hash 函数的方法:

  • 直接定址法:取关键字或关键字的某个线性函数值为散列地址。例如以年龄为关键字的散列表

  • 随机数法:选择一个随机函数,把关键字的随机函数值作为它的哈希值。通常用于关键字长度不等时采用此法构造哈希函数。

  • 折叠法:将关键字分为位数相同的几部分,然后取这几部分的叠加和(舍去进位)作为散列地址。

  • 平方取中法:先计算出关键字值的平方,然后取平方值中间几位作为散列地址。

  • 除留余数法(最常用的):取关键字被某个不大于散列表长度 m 的数 p 求余,得到的作为散列地址。

  • 数字分析法:当关键字的位数大于地址的位数,对关键字的各位分布进行分析,选出分布均匀的任意几位作为散列地址。仅适用于所有关键字都已知的情况下,根据实际应用确定要选取的部分,尽量避免发生冲突。

Hash表大小的确定

Hash 表的空间如果远远大于实际存储的记录数据的个数,则造成空间浪费;如果过小,则容易造成冲突。Hash 表大小确定通常有这两种思路:
如果最初知道存储的数据量,则需要根据存储个数 和 关键字的分布特点来确定 Hash 表的大小。
事先不知道最终需要存储的记录个数,需要动态维护Hash表的容量,此时可能需要重新计算 Hash 地址。

Hash冲突解决
(1)拉链法
在重复下表的下面又开了一个数组,在这个数组将重复的全部装进去,这样在查找的时候只需要遍历这个数组就ok了;
(2)开放地址法
这种方法简单来说就是当元素下标值发生冲突时,寻找空白的位置插入数据,三种方法,分别是 线性探测 、二次探测 、再哈希法,其中再哈希法就是再将我们传入的值进行一次 哈希化,获得一个新的探测步数 step,然后按照这个步数进行探测,找到第一个空着的位置插入数据。这在很大的程度上解决了 聚集 的问题。
Hash 实现方案

这几个都是集合类都是基于散列表,分析它们可以从如下几个点出发:

线程安全:HashTable是线程安全,HashMap和HashSet不是;
实现方式:HashMap基于拉链法的散列表,链过长会自动转为红黑树,HashSet底层采用HashMap实现的;
初始大小:HashTable初始大小是11,HashMap初始大小是16
空值:HashMap可以将空值作为key(一条:键不能重复)或者value(多条),HashTable不允许null值(键与值都不行),HashSet多个null只会有一个null存在。
扩容方式:HashTable采用:(oldCapacity << 1) + 1,HashMap采用oldCap << 1
哈希值:HashTable直接使用对象的hashCode,而HashTable采用在对象的hashCode上还进行的处理变化;
Hash 表的及优劣

(1)优点

对于一些大数据多数据,hash表处理起来比较轻松
能够快速的 查,改,插,删元素 等操作
代码简单(自己想好hash函数就完成啦)

(2)缺点

在hash函数处理某些元素的时候,不免出现下标重复相同的情况,这种情况可以称作为冲突
哈希表中的数据都是没有顺序的

2. 解题技巧(我的总结)

1> 原地哈希(题目限制空间复杂度时使用)

题目说明实现
41. 缺失的第一个正数数值n存到数组中的n-1位置我的提交
LCR 120. 寻找文件副本数值n存到数组中的n位置我的提交
442. 数组中重复的数据数值n存到数组中的n-1位置我的提交

2> 大量无规则数据问题的简化

题目说明实现
554. 砖墙前缀和的方式记录每块砖的右端点,hash找出最大出现次数的我的提交
1711. 大餐计数记录所有数的出现次数,对每个数枚举其对面数的可能性我的提交

3> 集合交并/子集

题目说明实现
1452. 收藏清单记录每个字符串出现的idx列表,i位置的字符串j:j出现的位置cnt都+1,看最后是否有个位置cnt和i字符串数相同我的提交

3. 更多练习

4. 参考

  1. ❤数据结构入门❤——哈希表
  2. 总库:tryHard

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

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

相关文章

机器学习算法与Python实战 | 常见统计概率分布实现(内含python代码)

本文来源公众号“机器学习算法与Python实战”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;https://mp.weixin.qq.com/s/0Lgmdvey70wXQcP1XQvylQ 在平时的科研中&#xff0c;我们经常使用统计概率的相关知识来帮助我们进行城市研…

第五节 zookeeper集群与分布式锁_2

1.分布式锁概述 1.1 什么是分布式锁 1&#xff09;要介绍分布式锁&#xff0c;首先要提到与分布式锁相对应的是线程锁。 线程锁&#xff1a;主要用来给方法、代码块加锁。当某个方法或代码使用锁&#xff0c;在同一时刻仅有一个线程执行该方法或该代码段。 线程锁只在同一J…

二分、快排、堆排与双指针

二分 int Binary_Search(vector<int> A,int key){int nA.size();int low0,highn-1,mid;while(low<high){mid(lowhigh)/2;if(A[mid]key)return mid;else if(A[mid]>key)highmid-1;elselowmid1; }return -1; }折半插入排序 ——找到第一个 ≥ \ge ≥tem的元素 voi…

代码随想录Day52 | 打家劫舍

代码随想录Day52 | 打家劫舍 198.打家劫舍213.打家劫舍II337.打家劫舍III 198.打家劫舍 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 动态规划&#xff0c;偷不偷这个房间呢&#xff1f;| LeetCode&#xff1a;198.打家劫舍 状态 选与不选 dp数组 dp[j] 表示第j个位…

【医学知识图谱 自动补全 关系抽取】生成模型 + 医学知识图谱 = 发现三元组隐藏的关系实体对

生成模型 医学知识图谱 发现三元组新关系实体对 提出背景问题&#xff1a;如何自动发现并生成医疗领域中未被标注的实体关系三元组&#xff1f;CRVAE模型 提出背景 论文&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3219819.3220010 以条件关系变分自编码器&#xff08;…

第7章 Page449 7.8.9智能指针 std::unique_ptr课堂作业,使用智能指针改写foo()函数

源代码&#xff1a; /** \brief 使用std::unique_ptr改写智能指针章节开始的foo()函数** \param* \param* \return**/ #include <iostream> #include <memory>using namespace std;struct O {~O(){cout << "我是被管的对象。我要被释放啦......" …

php基础学习之文件包含

描述 在一个php脚本中&#xff0c;将另一个php文件包含进来&#xff0c;合作实现某种功能 这个描述看起来似乎和C/Java等语言的头文件/包有点类似&#xff0c;但本质是不一样的 打个比方&#xff1a; C/Java的头文件/包更像是一个工具箱&#xff0c;存放各种很完善的工具&#…

Git快速掌握,通俗易懂

Git分布式版本控制工具 介绍 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git可以帮助开发者们管理代码的版本&#xff0c;避免代码冲突&#…

C# 异步方法的使用场景

我一直认为C#的异步方法只是一堆华而不实的东西&#xff0c;坑特别多&#xff0c;比起直接自建线程也没有任何优势。 直到有一天&#xff0c;一个需求场景&#xff0c;让我再次想到了C#的异步方法。 需求场景如下&#xff1a;需要写一个程序控制机械臂完成各种动作。每个动作要…

机器学习分类评估四个术语TP,FP,FN,TN

分类评估方法主要功能是用来评估分类算法的好坏&#xff0c;而评估一个分类器算法的好坏又包括许多项指标。了解各种评估方法&#xff0c;在实际应用中选择正确的评估方法是十分重要的。 这里首先介绍几个常见的模型评价术语&#xff0c;现在假设我们的分类目标只有两类&#x…

Dockerfile 常用指令

1、FROM 指定base镜像。 2、Docker history 显示镜像的构建历史&#xff0c;也就是Dockerfile的执行过程。 Missing 表示无法获取IMAGE ID&#xff0c;通常从Docker Hub下载的镜像会有这个问题。 3、调试Dockerfile&#xff0c;使用sudo docker run -it XXXX&#xff0c;XXXX…

英文单词-计算:Calculate与Compute的区别是什么

英文单词-计算:Calculate与Compute的区别是什么 compute 源自法语&#xff1b;calculate 源自拉丁语。在使用上&#xff0c;calculate 使用得更为广泛 calculate侧重人的分析&#xff0c;而compute侧重机器的运算。 calculator是“计算器”&#xff0c;而computer是“计算机”…

【大数据面试题】007 谈一谈 Flink 背压

一步一个脚印&#xff0c;一天一道面试题&#xff08;有些难点的面试题不一定每天都能发&#xff0c;但每天都会写&#xff09; 什么是背压 Backpressure 在流式处理框架中&#xff0c;如果下游的处理速度&#xff0c;比上游的输入数据小&#xff0c;就会导致程序处理慢&…

输入输出自定义映射矩阵(数据结构树)

输出自定义FC其它算法实现&#xff0c;可以参考下面文章&#xff1a; https://rxxw-control.blog.csdn.net/article/details/125994252https://rxxw-control.blog.csdn.net/article/details/125994252下面我们看下我们的控制要求。在学习本篇博客之前大家可以熟悉下数据结构图…

Mybatis——Javaweb进阶学习(五)

目录 一、Mybatis快速入门1.创建Springboot工程&#xff0c;数据库表user&#xff0c;实体类User2.引入Mybaties相关依赖3.编写Sql语句 二、lombok1.基本概念2.使用方法 三、基础操作1.环境准备a.数据库准备b.创建员工实体类Emp数据类型对比命名对比 c.Mapper接口创建 2.删除操…

CSS盒子的概念

盒子模型 盒子的概念 页面中的每一个标签都可以看做是一个“盒子”&#xff0c;通过盒子的视角更方便的进行布局 浏览器在渲染&#xff08;显示&#xff09;网页时&#xff0c;会将网页中的元素看做是一个个的矩形区域&#xff0c;称之为“盒子” 盒子模型 CSS中规定每个盒…

从计算机恢复已删除文件的 6 种方法!

如果您的重要文件之一已从计算机中删除怎么办&#xff1f;如果不小心从硬盘中删除了文件怎么办&#xff1f; 如今的公司通常将重要数据存储在云或硬盘中。但最重要的是&#xff0c;您必须考虑这样一个事实&#xff1a;您可能会丢失计算机上的数据。数据丢失的原因有多种&#x…

C语言-----用二维数组解决菱形的打印问题

1.打印菱形&#xff0c;多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 #include <stdio.h>int main() {int n0;while(scanf("%d",&n)! EOF){int i0;int j0;f…

python第六节:字典dict(2)

修改字典 1 直接给字典中不存在的键赋值 例子1&#xff1a; dict1 {name: 张三, age: 18, sex: 女,0: 0}print(dict1) dict1[new1]new_value1dict1[3]new_value3print(dict1) 结果1&#xff1a; {name: 张三, age: 18, sex: 女, 0: 0} {name: 张三, age: 18, sex: 女, 0…

Python爬虫html网址实战笔记

仅供学习参考 一、获取文本和链接 import requests from lxml import htmlbase_url "https://abcdef自己的网址要改" response requests.get(base_url) response.encoding utf-8 # 指定正确的编码方式tree html.fromstring(response.content, parserhtml.HTML…