16哈希表-基础操作

目录

哈希表

散列思想

哈希表的实现

简单示例

开胃菜:LeetCode之路——242. 有效的字母异位词

分析



哈希表

英文名字为Hash table,散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash表”。

哈希表(Hash Table)是一种数据结构,用于存储和检索键值对数据。它的核心思想是通过散列函数将键映射到一个特定的位置,该位置通常称为桶(Bucket),然后在该位置存储相应的值。这使得在平均情况下,我们可以在常数时间内(O(1))进行数据的插入、查找和删除操作。

散列思想

散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。以下是哈希表的核心思想和实现:

  1. 散列函数(Hash Function): 哈希表的关键部分是散列函数,它接受一个键作为输入并返回一个整数,这个整数通常称为哈希码。散列函数的目标是将不同的键均匀地映射到不同的桶,最大程度地减少冲突(即多个键映射到同一个桶的情况)。

  2. 桶(Bucket): 哈希表的底层数据结构是由一组桶组成的数组,每个桶可以存储一个或多个键值对。通过散列函数计算的哈希码确定了键值对应该存储在哪个桶中。

  3. 解决冲突: 由于不同的键可能映射到相同的桶,因此需要一种方法来处理冲突。常见的冲突解决方法包括链地址法(Chaining)和开放地址法(Open Addressing)等。

哈希表的实现
  1. 初始化: 创建一个包含一定数量桶的数组。桶的数量通常是一个质数,它的选择会影响哈希表的性能。

  2. 散列函数: 实现一个散列函数,将键映射到数组的索引位置。散列函数的设计很关键,它应该尽量避免冲突,同时也要尽可能均匀地分布键。

  3. 插入操作: 当要插入一个键值对时,首先计算键的哈希码,然后根据哈希码找到对应的桶,将键值对插入到桶中。如果发生冲突,根据冲突解决策略来处理。

  4. 查找操作: 当要查找一个键对应的值时,通过散列函数计算键的哈希码,然后找到对应的桶,进一步在桶中查找键值对。

  5. 删除操作: 删除操作类似于查找操作。首先计算键的哈希码,找到对应的桶,然后在桶中查找并删除键值对。同样,如果发生冲突,需要根据冲突解决策略来处理。

简单示例
  1. 字典应用: 就像上面图中的示例一样,哈希表可以用于实现字典,其中单词是键,含义是值。

  2. 电话簿: 电话号码和联系人名称可以存储在哈希表中,以便快速查找联系人信息。

  3. 缓存: 缓存数据结构通常使用哈希表来存储已检索的数据,以便快速查找并避免重复计算或查询。

  4. 文件索引: 用于快速查找文件或文件块的文件索引可以使用哈希表来实现。

  5. 身份验证: 存储用户名和密码的数据库可以使用哈希表来加速用户身份验证。

  6. 统计信息: 统计信息,如网站访问计数器或用户活动记录,可以使用哈希表来实现。

  7. 缓存控制: 用于记录最近访问的网页或资源的缓存管理可以使用哈希表来提高性能。

  8. 路由表: 在网络路由器中,路由表可以使用哈希表来存储目的地址和下一跳信息,以便路由数据包。

开胃菜:LeetCode之路——242. 有效的字母异位词

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

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

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104

  • st 仅包含小写字母

分析

1.如果s和t长度不相等,那么必然不合题意。

2.题意可知,如果s和t异位,那么对应字符的数量是一致的。所以这里用map存储key/value键值对。

3.先遍历s存储字符,然后再遍历t,删除字符,如果删除出现value<0,那么就说明t中包含一个不在s中的额外字符,返回false。

class Solution {public boolean isAnagram(String s, String t) {if (s.length() != t.length()) {return false;}Map<Character, Integer> map = new HashMap<Character, Integer>();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);map.put(c, table.getOrDefault(c, 0) + 1); // getOrDefault可以避免NPE异常}for (int i = 0; i < t.length(); i++) {char c = t.charAt(i);map.put(c, table.getOrDefault(c, 0) - 1);if (map.get(c) < 0) {return false;}}return true;}
}
  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

typescript 类型声明文件

typescript 类型声明文件概述 在今天几乎所有的JavaScript应用都会引入许多第三方库来完成任务需求。这些第三方库不管是否是用TS编写的&#xff0c;最终都要编译成JS代码&#xff0c;才能发布给开发者使用。6我们知道是TS提供了类型&#xff0c;才有了代码提示和类型保护等机…

盒子模型的基础

盒子模型 边框&#xff08;border&#xff09; border可以设置元素的边框&#xff0c;边框分成三部分&#xff0c;边框的&#xff08;粗细&#xff09;边框的样式&#xff0c;边框的颜色 <style>div {width: 100px;height: 100px;border-width: 200;border-style: 边框…

时序分解 | Matlab实现CEEMDAN完全自适应噪声集合经验模态分解时间序列信号分解

时序分解 | Matlab实现CEEMDAN完全自适应噪声集合经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现CEEMDAN完全自适应噪声集合经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CEEMDAN完全自适应噪声集合经验模态分解时间…

基于SSM的旅游网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Springboot+vue的开放性实验室管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的开放性实验室管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的开放性实验室管理系统&#xff0c;采用M&#xff08…

python开发幸运水果抽奖大转盘

概述 当我女朋友跟我说要吃水果&#xff0c;又不知道吃啥水果时候&#xff0c;她以为难为到我了&#xff0c;有啥事难为到程序员的呢&#xff01; 今天用python利用第三方tkinterthreadingtime库开发一个幸运水果抽奖大转盘&#xff01;抽到啥吃啥 详细 老规矩&#xff01;咱…

Qt 设置软件的版本信息:QMake、CMake工程

本文借鉴了Qt 设置软件的版本信息 - 疯狂delphi - 博客园 (cnblogs.com) 在原文基础增加了CMake工程实现的方法。 Qt设置软件的版本等信息 对于Qt开发的软件&#xff0c;我们如何去方便的查看其软件的版本信息。这里提供了几种方式。 在运行程序期间设置版本信息 大部分的程序…

CDN是什么?(网络零基础入门篇)

1.CDN的全称 是 Content Delivery Network&#xff0c;即内容分发网络。 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。 通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网…

黑豹程序员-架构师学习路线图-百科:JSON替代XML

文章目录 1、数据交换之王2、XML的起源3、JSON诞生4、什么是JSON 1、数据交换之王 最早多个软件之间使用txt进行信息交互&#xff0c;缺点&#xff1a;纯文本&#xff0c;无法了解其结构&#xff1b;之后使用信令&#xff0c;如&#xff1a;电话的信令&#xff08;拨号、接听、…

高数:第三章:一元函数积分学

文章目录 一、不定积分(一)两个基本概念&#xff1a;原函数、不定积分(二)原函数的存在性&#xff1a;原函数存在定理(三)不定积分的性质(四)基本积分公式(五)三种主要积分法1.凑微分 (第一类换元法)2.换元法 (第二类换元法)①三角代换②根式代换③倒代换 3.分部积分法4.其他技…

7 航空公司客户价值分析

第7章 航空公司客户价值分析 7.1 了解航空公司现状与客户价值分析7.1.1 了解航空公司现状7.1.2 认识客户价值分析7.1.3 熟悉航空客户价值分析的步骤与流程 7.2 预处理航空客户数据7.2.1 处理数据缺失值与异常值7.2.2 构建航空客户价值分析的关键特征1. RFM模型介绍2. RFM模型结…

3D孪生场景搭建:模拟仿真

前面几期文章介绍如何使用NSDT 编辑器 搭建3D应用场景&#xff0c;本期介绍下孪生场景中一个一个非常重要的功能&#xff1a;模拟仿真。 1、什么是模拟仿真 模拟仿真是一种用于描述、分析和模拟现实世界中系统、过程或事件的计算机模型和程序。仿真通过输入各种参数和条件&am…

王道考研计算机网络——传输层

一、传输层概述 复用&#xff1a;发送方不同的应用进程都可以使用同一个传输层的协议来传送数据 分用&#xff1a;接收方的传输层在去除报文段的首部之后能把数据交给正确的应用进程 熟知端口号就是知名端口号0-1023 客户端使用的端口号是动态变化的&#xff0c;不是唯一确定…

【CMU15-445 Part-15】Query Planning Optimization II

Part15-Query Planning & Optimization II Selection Statistics 维护每张表中的基本主要信息也就是tuple数量 N R N_R NR​以及每个属性中不同值的数量 V ( A , R ) V(A,R) V(A,R)&#xff0c; N R N_R NR​关系R中的元组数量&#xff0c;单独维护&#xff0c;不能用pag…

几种开源协议的区别(Apache、MIT、BSD、MPL、GPL、LGPL)

作为一名软件开发人员&#xff0c;你一定也是经常接触到开源软件&#xff0c;但你真的就了解这些开源软件使用的开源许可协议吗&#xff1f; 你不会真的认为&#xff0c;开源就是完全免费吧&#xff1f;那么让我们通过本文来寻找答案。 一、开源许可协议简述 开源许可协议是指开…

26358-2022 旅游度假区等级划分 思维导图

声明 本文是学习GB-T 26358-2022 旅游度假区等级划分. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了旅游度假区的等级划分和依据、总则、基本条件、省级和国家级旅游度假区条件。 本文件适用于旅游度假区的等级认定与复核依据…

Labview 实战 99乘法表

基于新手小白&#xff0c;使用Labview实现99乘法表&#xff0c;敢于发表自己的一点方法&#xff0c;还请各位大侠放过&#xff01; 如下&#xff1a; 运行效果如下&#xff1a; 思路为&#xff1a;将要显示出来的数据&#xff0c;全部转换为字符串形式&#xff0c;再塞入到数组…

【成像光敏描记图提取和处理】成像-光电容积描记-提取-脉搏率-估计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL存储结构

MySQL存储结构 1、存储结构1.1存储结构概述1.2优点1.3存储过程应用1.4触发器 2、实际操作2.1创建存储过程2.1调用2.3查看存储过程2.4查看存储过程状态2.5查看指定存储过程信息 3、存储过程的参数3.1参数3.2实际操作3.3修改存储过程3.4删除存储过程 4、总结 1、存储结构 1.1存储…

黑马点评-01基于Redis实现短信登陆的功能

环境准备 当前模型 nginx服务器的作用 手机或者app端向nginx服务器发起请求,nginx基于七层模型走的是HTTP协议,可以实现基于Lua直接绕开tomcat访问Redis nginx也可以作为静态资源服务器,轻松扛下上万并发并负载均衡到下游的tomcat服务器,利用集群支撑起整个项目 使用nginx部…