16哈希表-基础操作

news2025/2/24 15:44:50

目录

哈希表

散列思想

哈希表的实现

简单示例

开胃菜: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.coloradmin.cn/o/1063952.html

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

相关文章

vue3中使用return语句返回this.$emit(),在同一行不执行,换行后才执行,好奇怪!

今天练习TodoList任务列表案例,该案例效果如图所示&#xff1a; 此案例除了根组件App.vue&#xff0c;还有TodoList、TodoInput、TodoButton三个子组件。 因为有视频讲解&#xff0c;在制作TodoList、TodoInput时很顺利&#xff0c;只是在完成TodoButton这个组件时出了点问题…

VR开发(一)——SteamVR实现摇杆移动

一、基础环境搭建 1.AssetStore 找到SteamVR并导入&#xff1b; 2.添加一个 VR 中代表玩家自己的物体。我可以打开 Assets/SteamVR/InteractionSystem/Core 文件夹&#xff0c;将 Player 物体拖入场景&#xff1a; 二、修改手柄按钮映射集 3.windows/steamVR input&#xff…

【程序员必看】计算机网络,快速了解网络层次、常用协议和物理设备!

文章目录 0 引言1 基础知识的定义1.1 计算机网络层次1.2 网络供应商 ISP1.3 猫、路由器、交换机1.4 IP协议1.5 TCP、UDP协议1.6 HTTP、HTTPS、FTP协议1.7 Web、Web浏览器、Web服务器1.8 以太网和WLAN1.9 Socket &#xff08;网络套接字&#xff09; 2 总结 0 引言 在学习的过程…

OpenResty编译安装详解

文章目录 一、概述1、OpenResty是什么2、官方文档 二、cengos安装OpenResty1、从官网下载2、目录结构3、编译安装 一、概述 1、OpenResty是什么 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台&#xff0c;其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖…

【Word】公式编辑器中连字符/减号等显示偏长/过长

问题 当公式编辑器中出现连字符的时候&#xff0c;连字符显示偏长&#xff0c;如下图所示&#xff1a; 方法 在连字符的前后加上双引号后即可解决连字符显示偏长的问题。 最终效果对比如下&#xff1a; 结语 Word的公式编辑器中&#xff0c;双引号内部的内容被当做普通…

基于FastAPI的文件上传和下载

基于FastAPI的文件上传和下载 一、前言 为了实现ASR的可视化界面&#xff0c;在各个博客中寻觅了一波找找文件上传和下载的例子&#xff0c;没有找到能完整实现这个功能的&#xff0c;有也只是有一部分&#xff08;菜菜求捞捞&#xff09;&#xff0c;看了甚是烦恼&#xff0…

DBC配置SecOC属性

关联文章:Autosar基础——车载信息安全SecOC 属性定义的规范详细介绍请参考 ①dbc属性定义 ②Vector DBC属性定义规则 文章目录 一、SecOC简介二、DBC文件中的SecOC属性三、配置SecOC属性设置SecOC的属性设置同步报文的属性设置同步请求报文的属性一、SecOC简介 在车载网络中…

怎么利用互联网赚钱,网上赚钱的7种方法

互联网的兴起改变了我们的生活方式&#xff0c;不仅让我们的世界更为便捷&#xff0c;也为我们提供了赚钱的机会。越来越多的人开始通过互联网实现财富梦想。你是否曾想过&#xff0c;如何利用互联网来赚钱呢&#xff1f;今天&#xff0c;我将为大家分享七种赚钱方法&#xff0…

数据分析篇-数据认知分析

一简介 数据认知分析&#xff0c;实际是对数据的整体结构和分布特征进行分析&#xff0c;是对整个数据外在的认识&#xff0c;也是数据分析的第一步。对于数据认知的分析&#xff0c;一般会考虑分散性、位置特性、变量的相关性等&#xff0c;一般会考虑平均数、方差、极差、峰…

算法通过村第十二关-字符串|白银笔记|经典面试题

文章目录 前言1. 反转问题1.1 反转字符串1.2 k个一组反转1.3 仅仅反转字母1.3.1 采用栈实现操作1.3.2 采用双指针实现操作 1.4 反转字符串里面的单词1.4.1 使用语言提供的方法来解决(内置API)1.4.2 如何优雅自己实现上述功能 2. 验证回文串3. 字符串中的第一个唯一字符4. 判断是…

SaaS 电商设计 (二) 全链路解决方案概述和核心业务流程梳理

一.业务目标&技术目标 业务目标:完成多业态,多渠道的数字化运营 自有业务: O2O,B2C,B2B2C,S2B2b 平台业务:POPB2c,POPB2b,POPS2B2b 1.1 自有业务 O2O:全称Online to Offline.泛指的线上线下的业务融合.这种的情况分为两种情况,第一种通过线上的数字化运营引导线上用户线下…

oCPC实践录 | oCPC转化的设计、选择、归因与成本设置(4)

读者们&#xff0c;中秋十一快乐&#xff0c;一篇文章奉上。 在上篇oCPC实践录 | oCPC转化的设计、选择、归因与成本设置&#xff08;3&#xff09;文章中我们主要讨论&#xff1a;怎么定义高价值用户&#xff0c;回传高价值用户不一定利益最大化&#xff0c;回传高ROI用户逻辑…

速度轴模拟量控制FB(博途SCL+三菱ST代码)

利用模拟量实现变频器的正反转直接控制具体方法,请参考下面文章链接: 模拟量0-10V信号控制变频器实现正反转速度随动_RXXW_Dor的博客-CSDN博客比例随动专栏有系列文章介绍,大家可以查看相关文章,链接如下:绕线机-排线伺服比例随动功能块(梯形图+SCL代码)_RXXW_Dor的博客…

自己实现扫描全盘文件的函数。

1.自己实现扫描全盘的函数 def scan_disk(dir): global count,dir_count if os.path.isdir(dir): files os.listdir(dir) for file in files: print(file) dir_count 1 if os.path.isdir(dir os.sep file): …

MATLAB:线性系统的建模与仿真(含完整程序)

目录 前言实验内容一、先看作业题目要求二、作业正文Modeling LTI systemsEstablish model1.tf(sys2)2. tf(sys3)3.zpk(sys1)4. zpk(sys3)5. ss(sys1)6. ss(sys2)7.[num,den] tfdata(sys1)8.[num,den] tfdata(sys2)9.[num,den] tfdata(sys3)10.[num,den] tfdata(sys1,’v’…

【Linux】信号简介与触发信号的几种方式

相信大家或多或少都听说过信号这一概念&#xff0c;这篇博客将为大家讲解一些信号方面的基础知识 信号简介 定义Linux操作系统中重要的消息机制功能主要被用于进程干预处置&#xff0c;大多数信号的作用是杀死或挂起进程&#xff0c;只有少部分的信号不是用来杀死或挂起进程个…

【数据结构】排序(3)—堆排序归并排序

目录 一. 堆排序 基本思想 代码实现 向上调整算法 向下调整算法 时间和空间复杂度 稳定性 二. 归并排序 基本思想 代码实现 时间和空间复杂度 稳定性 一. 堆排序 堆排序&#xff08;Heapsort&#xff09;是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似 …

lambda表达式在实际开发中的使用

作为写代码已经两年的程序员了&#xff0c;lambda已经是再熟悉不过了。其实在众多的编程语言中&#xff0c;python javascript java中都有lambda的影子。包括比较新的编程语言golang&#xff0c;到最后发现其实各种语言的语法和特性都是相互抄袭的&#xff0c;所以在接触新技术…

drone和gogs安装

背景介绍 什么是 Drone&#xff1f; Drone 是一个面向忙碌的开发团队的自助持续集成和持续交付平台。官网地址&#xff1a; https://www.drone.io/同时&#xff0c;Drone 是使用 Golang 语言进行编写。所有的编译、测试的流程都在 Docker 容器中执行。Drone 通过使用简单的 YA…

直线导轨坏了可以维修吗?

直线导轨是工业自动化设备中常用的零部件&#xff0c;其性能和使用寿命对设备的稳定运行和产能有着直接的影响&#xff0c;在生产中&#xff0c;由于各种原因&#xff0c;直线导轨会出现各种问题&#xff0c;那么&#xff0c;直线导轨的维修方法究竟是怎样的呢&#xff1f;我们…