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

相关文章
|
算法
数据结构域算法系列之二 贪婪算法和人生规划
数据结构域算法系列之二 贪婪算法和人生规划
75 0
|
1月前
|
存储 机器学习/深度学习 算法
探索数据结构:入门及复杂度的解锁
探索数据结构:入门及复杂度的解锁
|
3月前
|
存储 算法
链表经典操作与实战
文章深入探讨了链表的基本概念、分类和经典操作,通过LeetCode上的实战题目展示了如何应用虚拟头节点、双指针法、定位前驱节点等技巧来解决链表相关问题,并强调了算法在软件开发中的重要性。
链表经典操作与实战
|
5月前
|
存储 算法 数据挖掘
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
|
6月前
|
算法 索引
【数据结构】10道经典面试题目带你玩转链表
【数据结构】10道经典面试题目带你玩转链表
122 0
|
6月前
|
存储 算法 C++
【C/C++ 数据结构】哈希表冲突解决策略深度解析:原理、数学与C/C++实践
【C/C++ 数据结构】哈希表冲突解决策略深度解析:原理、数学与C/C++实践
119 0
|
前端开发 搜索推荐 算法
数据结构和算法基础之时间复杂度为O(n²)排序(偏向前端方向)
在实际项目开发中,不管是后端还是前端,最基本的操作就是数据的CRUD。换句话说,后端是根据某些条件组装数据,前端是拿着后端提供的数据,进行数据展示。但是不管在进行数据封装还是展示,其中在特定的场景下,需要根据某些条件,对数据进行排序。而在既定的现有框架下,都有现成的方法对数据进行排序处理。 但是,在开发中,有没有想过,这些排序底层是如何实现的,还有就是针对不同的数据,不同的排序是否在性能方面有不同的体现。
125 0
数据结构和算法基础之时间复杂度为O(n²)排序(偏向前端方向)
|
存储 算法 JavaScript
数据结构和算法基础(偏向前端方向)
接下来的文档,将一起汇总一下我跟着极客时间的数据结构与算法之美的课程来一起回顾和总结一下(内容大部分是极客时间的,但是有一些也是我查询相关资料来进行比对和校验的)。
数据结构和算法基础(偏向前端方向)
|
存储 NoSQL 算法
那些面试官口中常常提到b树(MySQL索引底层数据结构)
那些面试官口中常常提到b树(MySQL索引底层数据结构)
数据结构183-欧拉七桥理论后续
数据结构183-欧拉七桥理论后续
59 0
数据结构183-欧拉七桥理论后续