Hash表经典操作与实践

简介: 文章探讨了Hash表在算法领域的应用,通过LeetCode上的实例题目展示了如何使用Hash表进行数据存在性判断、重复数据计数等操作,并强调了Hash表在提高查找效率和解决特定问题中的重要性。

前言

Hash表在我们开发工作中的使用频率不言而喻,在算法领域Hash表也是一个比较常用的数据结构,由于Hash查找时间,通过Hash算法可以快速定位数据是否存在。

Hash定义与问题

Hash表是可以通过hash算法确定某个key在集合中元素位置的数据结构。

截屏2024-01-16 23.18.39.png

上方,通过hash算法,我们可以计算key在存储哪个位置。hash表可以使用数组来实现,hash算法可以使用取模算法。

hash经典的操作

  • 判断数据是否已经存在。
Map map = new HashMap();

if(map.contains(key) {
   
   
   //key出现过了
}
  • 重复数据计数

  • 字母字符类型,可以使用整型数组作为hash表

由于字符和字符之间可以进行加减乘除运算,并且他们计算结果是整型,我们可以利用这一点,通过整型数组来构建字符的hash表。

Hash法实操

leetcode242. 有效的字母异位词

class Solution {
   
   
    public boolean isAnagram(String s, String t) {
   
   

        if(s.length() != t.length()) {
   
   
            return false;
        }


       Map<Character, Integer> map = new HashMap<>();

       for(int i=0; i< s.length(); i++) {
   
   
           //元素是否出现过
            if(!map.containsKey(s.charAt(i))) {
   
   
                 map.put(s.charAt(i), 1);
            } else {
   
   
                 //重复元素计数
                map.put(s.charAt(i), map.get(s.charAt(i)) + 1);
            }
       }

       for(int i=0; i< t.length(); i++) {
   
   
           if(!map.containsKey(t.charAt(i))) {
   
   
               return false;
           } else {
   
   
               map.put(t.charAt(i), map.get(t.charAt(i)) - 1);
           }
       }

       for(Map.Entry<Character, Integer> entry : map.entrySet()) {
   
   
           Integer value = entry.getValue();
           if(value != 0) {
   
   
            return false;
           }
       }

       return true;
    }
}

这道题目解题的关键依据是通过hash可以实现判断数据是否出现过重复数据计数

leetcode454. 四数相加 II

class Solution {
   
   
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
   
   

        Map<Integer,Integer> abmap = new HashMap<>();

        //先统计前两个数组元素和出现的次数
        for(int i=0; i<nums1.length; i++) {
   
   
            for(int j=0; j<nums2.length; j++) {
   
   
                //计算nums1,nums2和的次数
                int sum = nums1[i] + nums2[j];
                abmap.put(sum, abmap.getOrDefault(sum, 0) + 1);
            }
        }

        int result = 0;
        for(int i=0; i<nums3.length; i++) {
   
   
            for(int j=0; j<nums4.length; j++) {
   
   
                //计算前两个数组和nums3,nums4 和为0的次数
                int sum = nums3[i] + nums4[j];
                result  = result + abmap.getOrDefault(0-sum, 0);
            }
        }
        return result;

    }
}

这道题就是根据hash重复数据次数操作解决的。

2024加油,深入理解算法,学习算法,一起学习。

image.png

相关文章
|
Ubuntu 异构计算 Windows
ModelScope问题之下载推荐的基础镜像失败如何解决
ModelScope镜像是指用于在ModelScope平台上创建和管理的容器镜像,这些镜像包含用于模型训练和推理的环境和依赖;本合集将说明如何使用ModelScope镜像以及管理镜像的技巧和注意事项。
626 0
|
Java Linux
使用jps强制关闭java进程
使用jps强制关闭java进程
1500 0
使用jps强制关闭java进程
|
10月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
282 0
|
安全 物联网 API
API技术之身份认证
【10月更文挑战第17天】身份认证是API安全的核心,确保API可信可控。
API技术之身份认证
|
存储 缓存 Java
JUC并发—3.volatile和synchronized原理
本文介绍了volatile关键字的使用、主内存和CPU的缓存模型、CPU高速缓存的数据不一致问题、总线锁和缓存锁及MESI缓存一致性协议、Java的内存模型JMM、JMM如何处理并发中的原子性可见性有序性、volatile如何保证可见性、volatile为什么无法保证原子性、volatile如何保证有序性、volatile的原理(Lock前缀指令 + 内存屏障)、双重检查单例模式的volatile优化、基于volatile优化微服务的优雅关闭机制、优化微服务存活状态检查机制等 14.i++的多线程安全问题演示 1
|
数据采集 消息中间件 分布式计算
系统架构+技术选型+用例说明|学习笔记
快速学习系统架构+技术选型+用例说明
系统架构+技术选型+用例说明|学习笔记
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前开发的16QAM调制与软解调系统,增加了硬件测试功能。该系统包含FPGA实现的16QAM调制、软解调、高斯信道、误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置模块。通过硬件测试,验证了不同SNR条件下的系统性能。16QAM软解调通过比较接收信号采样值与16个调制点的距离,选择最近的调制点来恢复原始数据。核心Verilog代码实现了整个系统的功能,包括SNR设置、信号处理及误码率统计。硬件测试结果表明系统在不同SNR下表现良好,详细操作步骤可参考配套视频。
348 13
|
监控 搜索推荐 Linux
top 与 htop 实时监控
`top` 和 `htop` 是 Linux 系统中常用的实时监控工具。`top` 命令默认每 3 秒刷新一次,显示系统整体概览和进程列表,支持基本的进程管理操作。`htop` 则提供更友好的界面,带有彩色条形图、鼠标支持和更多交互功能,如进程搜索、优先级调整等。两者都适用于监控系统资源和管理进程,但 `htop` 功能更丰富,用户体验更好,适合复杂场景。
433 8
|
数据挖掘 Python
用python的tushare模块分析股票案例(python3经典编程案例)
该文章提供了使用Python的tushare模块分析股票数据的案例,展示了如何获取股票数据以及进行基本的数据分析。
1261 0
|
存储 SQL 关系型数据库
MySQL存储过程与触发器:提升数据库操作效率与数据一致性
本文深入探讨了MySQL数据库中的存储过程与触发器,通过丰富的代码示例,详细介绍了存储过程的定义与调用、参数与变量的应用,以及触发器的创建、使用和实际案例。存储过程作为预定义的一组SQL语句,能够提高数据库操作的效率,实现数据逻辑和复杂计算。同时,触发器作为在特定事件触发时自动执行的SQL语句,能够保障数据一致性和逻辑完整性。通过代码实例,读者将了解如何创建、调用存储过程,如何利用参数和变量进行数据处理,以及如何创建触发器并应用于实际场景。这些技术将使读者能够在数据库管理中更高效地进行操作和保障数据的完整性,为应用程序提供可靠的数据支持。
1469 0