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

相关文章
|
4月前
|
存储 关系型数据库 MySQL
解锁高效检索技能:掌握MySQL索引数据结构的精髓
解锁高效检索技能:掌握MySQL索引数据结构的精髓
|
29天前
|
存储 算法
链表经典操作与实战
文章深入探讨了链表的基本概念、分类和经典操作,通过LeetCode上的实战题目展示了如何应用虚拟头节点、双指针法、定位前驱节点等技巧来解决链表相关问题,并强调了算法在软件开发中的重要性。
链表经典操作与实战
|
3月前
|
存储 算法 C语言
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
|
3月前
|
存储 算法 数据挖掘
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
|
4月前
|
存储 算法 C++
【C/C++ 数据结构】哈希表冲突解决策略深度解析:原理、数学与C/C++实践
【C/C++ 数据结构】哈希表冲突解决策略深度解析:原理、数学与C/C++实践
82 0
|
4月前
|
存储 算法 安全
【Java编程进阶之路 02】深入探索:红黑树如何重塑哈希表的性能边界
JDK 1.8之后,HashMap引入红黑树来优化性能,当链表长度超过阈值(默认为8)时,链表会转换为红黑树,从而提高高冲突时的查询效率。同时,HashMap也采用了扰动函数来增加哈希值的随机性,使键值对更均匀分布,提升性能。
64 0
|
4月前
|
存储 NoSQL API
【Redi设计与实现】第三章:链表
【Redi设计与实现】第三章:链表
|
存储 架构师 关系型数据库
一步步带你设计MySQL索引数据结构
MySQL的索引是一个非常重要的知识点,也基本上是面试必考的一个技术点,所以非常重要。那你了解MySQL索引的数据结构是怎么样的吗?为什么要采用这样的数据结构? 现在化身为MySQL的架构师,一步步迭代设计出MySQL的索引结构,保证你再也忘记不了索引的结构了,轻松通过面试。
|
存储 NoSQL 算法
那些面试官口中常常提到b树(MySQL索引底层数据结构)
那些面试官口中常常提到b树(MySQL索引底层数据结构)
数据结构183-欧拉七桥理论后续
数据结构183-欧拉七桥理论后续
54 0
数据结构183-欧拉七桥理论后续