IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 代码随想录 算法训练营 哈希表 -> 正文阅读

[数据结构与算法]代码随想录 算法训练营 哈希表

基础知识 哈希表(Hash Table)

哈希表是根据关键码的值直接访问数据的数据结构,看了一个视频,感觉讲的很形象、很清楚👉哈希表是什么
hashCode把相应的字段转化为数值,hashCode通过特定编码方式,可以将其他数据格式转化为不同的数值。同时为了保证映射出来的索引数值都落在了哈希表上,我们会再次对数值做一个取模操作,保证所有字段都映射到哈希表上。

哈希碰撞

hash碰撞指的是,两个不同的值(比如张三、李四的学号)经过hash计算后,得到的hash值相同,后来的李四要放到原来的张三的位置,但是数组的位置已经被张三占了,导致冲突。参考👉哈希碰撞

拉链法

拉链法采用的是链表的方式,这个时候位置1就不单单存放的是Entry了,此时的Entry还要额外保存一个next指针,指向数组外的另一个位置,将李四安排在这里,张三那个Entry中的next指针就指向李四的这个位置,也就是保存的这个位置的内存地址。如果还有冲突,就把又冲突的那个Entry放到一个新位置上,然后李四的Entry指向它,这样就形成一个链表。参考👉哈希碰撞

线性探测法

如果使用线性探测法,那么一定要保证tableSize大于dataSize(数据规模),我们需要依靠哈希表的空位去解决碰撞问题。
例如:当前数组位置1被占用了,就放到下一个位置2上去,如果2也被占用了,就继续往下找,直到找到空位置。

常见的三种哈希结构

  1. 数组
  2. set集合
  3. map映射

当我们需要快速判断一个元素是否出现集合的时候,就要考虑使用哈希法

454.四数相加II

题目:

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

提示:

直接暴力解法时间复杂度为n2*n2可以在nums1中和nums2值中先相加找相同的值计数(假如找的值是a+b),再在nums3和nums4中查找c和d使其满足c+d=0-(a+b),这时时间复杂度为n2。

题解:

Java的哈希操作👉Java—HashMap

HashMap是一个散列表,它存储的内容是键值映射
HashMap的key与value的类型可以相同也可以不同

基本操作

  1. 定义哈希表
HashMap<Interger, String> hashmap = new HashMap<Integer, String>()
  1. 添加键值对(put)
hashmap.put(1, "string1"); // 执行完后hash表内为{1=string1}
hashmap.put(2, "string2"); // 执行完后hash表内为{1=string1, 2=string2}
hashmap.put(2, "string2"); // 执行完后hash表内为{1=string1, 2=string2, 3=string3}
  1. 根据key值访问value(get)
hashmap.get(1); // 返回string1
hashmap.get(2); // 返回string2
hashmap.get(3); // 返回string3
  1. 根据key值删除元素(remove)
hashmap.remove(1); // 执行完后hash表内为{2=string2, 3=string3}
hashmap.remove(2); // 执行完后hash表内为{3=string3}
hashmap.remove(3); // 执行完后hash表内为{}
// 删除所有键值对
hashmap.clear();
  1. 替换hashMap中指定的key对应的value
hashmap.replace(key,value);
  1. 返回hashmap中键值对的数量
hashmap.size();
  1. getOrDefault(Object key, V defaultValue)
hashmap.getOrDefault(key, defaultValue)
  1. entrySet() 方法可以与 for-each 循环一起使用,用来遍历迭代 HashMap 中每一个映射项
// foreach循环
for(var entry : map.entrySet()){
    // 获得key
    int key = entry.getKey();
	// 获得value
	int value = entry.getValue();
}
  1. 检查hashMap中是否存在指定的key对应的映射关系
hashmap.containsKey(key)
  1. 检查hashmap中是否存在指定的value对应的映射关系
hashmap.containsValue(value);
  1. 判断hashmap是否为空
hashmap.isEmpty();

java Solution

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
            Map<Integer, Integer> map = new HashMap();
            int temp;
            int res = 0;
            // 统计两个数组中的元素之和,同时统计出现的次数,放入map
            for(int i : nums1){
                for(int j : nums2){
                    temp = i + j;
                    // 检查map中是否存在指定的key对应的映射关系
                    if(map.containsKey(temp)){
                        //如果存在,则将temp对应的value加1
                        map.put(temp, map.get(temp) + 1);
                    }
                    else{
                        // 如果不存在,则新建一个temp的key,给这个value赋值1
                        map.put(temp, 1);
                    }
                }
            }
            // 统计剩余的两个元素的和,在map中查找是否存在相加为0的情况,同时记录次数
            for(int i : nums3){
                for(int j : nums4){
                    temp = i + j;
                    // 即判断是否存在nums1 + nums2 + nums3 + nums4 = 0的情况
                    if(map.containsKey(0 - temp)){
                        //如果存在,找到这个值的value,累加给res
                        res += map.get(0 - temp);
                    }
                }
            }
            return res;
    }       
}

python solution

python中的hashmap就是常用的字典dict

# 代码逻辑和Java版本相同,不再赘述注释
class Solution(object):
    def fourSumCount(self, nums1, nums2, nums3, nums4):
        hashmap = dict()
        for n1 in nums1:
            for n2 in nums2:
                if n1 + n2 in hashmap:
                    hashmap[n1+n2] += 1
                else:
                    hashmap[n1+n2] = 1
        
        count = 0
        for n3 in nums3:
            for n4 in nums4:
                key = -n3 - n4
                if key in hashmap:
                    count += hashmap[key]
        return count

总结

这是第一遍刷代码随想录,现在时间也比较有限,每天先只做一道最基础的熟悉熟悉语法吧

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:49:39  更:2022-11-05 00:49:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 18:02:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码