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镜像以及管理镜像的技巧和注意事项。
546 0
|
Java Linux
使用jps强制关闭java进程
使用jps强制关闭java进程
1452 0
使用jps强制关闭java进程
|
6月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
207 0
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
1922 5
|
安全 物联网 API
API技术之身份认证
【10月更文挑战第17天】身份认证是API安全的核心,确保API可信可控。
API技术之身份认证
|
数据挖掘 Python
用python的tushare模块分析股票案例(python3经典编程案例)
该文章提供了使用Python的tushare模块分析股票数据的案例,展示了如何获取股票数据以及进行基本的数据分析。
1048 0
|
前端开发 测试技术
如何从零到一建立前端规范
【10月更文挑战第6天】
307 2
|
数据采集 消息中间件 分布式计算
系统架构+技术选型+用例说明|学习笔记
快速学习系统架构+技术选型+用例说明
系统架构+技术选型+用例说明|学习笔记
|
Java 数据库连接 Apache
全网首发一IoTDB数据库整合MyBatis实现SpringBoot项目CRUD
最近用到IoTDB数据库,经过对一些相关文档的搜集,大概了解到了该数据库的主要应用场景和使用方法,本篇就讲一下如何利用IoTDB并结合SpringBoott和Mybatis进行项目整合。经过一番查找全网都没有一篇完整的关于该数据库采用Mybatis做持久化框架的文章,那么就由我来开辟一下先河。
1420 0
|
机器学习/深度学习 数据采集 人工智能
构建高效AI模型:深度学习优化策略和实践
【5月更文挑战第26天】 在人工智能的浪潮中,深度学习作为一项核心技术,其模型构建与优化一直是研究的热点。本文旨在探讨如何通过一系列创新性的优化策略提升深度学习模型的性能及效率。我们将从理论与实践两个维度出发,详细阐述包括数据预处理、网络结构设计、损失函数选择、正则化技巧以及超参数调整等方面的优化措施。通过这些策略的综合运用,可以显著提高模型的准确性,降低过拟合风险,并缩短训练时间,为AI领域的研究者和工程师提供有价值的参考。