前端算法:字典and哈希表(力扣1题、349题解法)

目录

一、字典

1.概念

2.特点

3.在JS中如何实现

4.字典用法

使用对象作为字典

使用map

5.应用场景

二、哈希表

1.概念

2.工作原理

 3. 在 JavaScript 中的实现

4.哈希表用法

 使用 Map 作为哈希表

5.应用场景

三、字典与哈希表的区别

 四、力扣算法实战

1.1题 两数之和

2.349题 两个数组的交集

五、总结


一、字典

1.概念

字典是一种以键值对形式存储数据的集合。在字典中,每个键都是唯一的,值可以是任意类型。这种结构使得查找、插入和删除操作变得非常高效。

2.特点

  • 唯一性:字典中的每个键都是唯一的,不能重复。
  • 快速查找:通过键可以快速访问到对应的值,平均时间复杂度为 �(1)O(1)。
  • 灵活性:可以存储多种数据类型的值。

3.在JS中如何实现

在 JavaScript 中,可以使用对象({})或 ES6 引入的 Map 来实现字典。

4.字典用法

使用对象作为字典
// 创建一个字典
const dictionary = {"apple": "A fruit that is red or green.","banana": "A long yellow fruit.","orange": "A citrus fruit."
};// 查找值
console.log(dictionary["apple"]); // 输出: A fruit that is red or green.// 添加新键值对
dictionary["grape"] = "A small, round fruit.";
console.log(dictionary["grape"]); // 输出: A small, round fruit.// 删除键值对
delete dictionary["banana"];
console.log(dictionary["banana"]); // 输出: undefined
使用map
// 创建一个字典
const map = new Map();
map.set("apple", "A fruit that is red or green.");
map.set("banana", "A long yellow fruit.");// 查找值
console.log(map.get("banana")); // 输出: A long yellow fruit.// 添加新键值对
map.set("grape", "A small, round fruit.");
console.log(map.get("grape")); // 输出: A small, round fruit.// 删除键值对
map.delete("apple");
console.log(map.get("apple")); // 输出: undefined

5.应用场景

  • 数据存储:可以用来存储用户信息、配置选项、字典数据等。
  • 频率统计:统计单词出现频率,例如在文本分析中。
  • 快速查找:用于需要频繁查找的场景,如缓存、路由配置等。

二、哈希表

1.概念

哈希表是一种实现字典的数据结构,利用哈希函数将键映射到数组索引。这种映射允许在常数时间内(理想情况下)查找、插入和删除元素。

2.工作原理

  • 哈希函数:将键转换为数组的索引。好的哈希函数应当尽可能均匀地分布键,以减少冲突。
  • 冲突处理:当两个不同的键被哈希到同一个索引时,称为冲突。常见的解决方法包括:
    • 链式存储:在每个索引位置使用一个链表来存储所有映射到该位置的键值对。
    • 开放地址法:在数组中查找下一个可用位置来存储冲突的键值对。

 3. 在 JavaScript 中的实现

JavaScript 的 Map 和对象({})可以视为哈希表的实现。Map 允许使用任何类型的值作为键,且保留插入顺序。

4.哈希表用法

 使用 Map 作为哈希表
// 创建一个哈希表
const hashTable = new Map();// 插入数据
hashTable.set("name", "Alice");
hashTable.set("age", 30);
hashTable.set("city", "New York");// 查找数据
console.log(hashTable.get("name")); // 输出: Alice// 删除数据
hashTable.delete("age");
console.log(hashTable.has("age")); // 输出: false

5.应用场景

  • 缓存:快速查找和存储数据,如 API 响应缓存。
  • 数据库索引:加速数据库查询操作。
  • 频率统计:类似于字典,但在高并发情况下的表现通常更好。

三、字典与哈希表的区别

特点字典哈希表
数据结构以键值对形式存储数据使用哈希函数映射键到索引
时间复杂度平均 O(1)理想情况下平均 O(1)
键的类型键通常是字符串或符号键可以是任意数据类型
处理冲突使用链表或其他方法处理冲突使用链式存储或开放地址法处理冲突
语言支持多种语言均支持多数语言中都有哈希表的实现

 四、力扣算法实战

1.1题 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

 解题思路:设立一个字典,循环数组,用目标值减去循环的值,然后查找字典里是否含有结果,如果有就返回,没有就放到map里

代码如下:

var twoSum = function(nums, target) {let map = new Map()for(let i=0;i<nums.length;i++){num = target - nums[i]if(map.has(num)){return [map.get(num),i]}map.set(nums[i],i)}
};

2.349题 两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

解题思路:只需要返回数组的交集,那么 先将第二个数组放进集合中,然后从第一个数组运用集合扁平化之后将重复元素去除,在用过滤器查找是否含有相同数。

代码如下

var intersection = function(nums1, nums2) {let set = new Set(nums2);return [...new Set(nums1)].filter((val)=>set.has(val))
};

五、总结

字典是一种用于存储键值对的数据结构,允许通过唯一键快速访问对应的值,而哈希表则是实现字典的底层数据结构,通过哈希函数将键映射到存储位置,从而支持高效的查找、插入和删除操作。虽然字典通常保持键的插入顺序(在某些语言中),哈希表的实现则侧重于处理键的碰撞和动态调整大小,以保持性能。总的来说,字典依赖哈希表的高效性来实现其功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM之RAG实战(四十四)| rag-chatbot:支持Huggingface和Ollama任意模型的多PDF本地RAG方案

特点&#xff1a; 支持本地运行和Kaggle (new)运行支持Huggingface 和Ollama 的任意模型Process multiple PDF inputs.Chat with multiples languages (Coming soon).Simple UI with Gradio. 一、安装使用 1.1 Kaggle&#xff08;推荐&#xff09; Step1&#xff1a;把https…

Android 10.0 Camera2 拍照镜像功能实现

1.前言 在10.0的系统rom定制化开发中,在进行camera2的相关拍照功能开发中,在某些时候会遇到拍照照片 左右镜像的问题,就是照片左半边和右半边是反的,所以就需要在拍照的时候保存图片的时候实现 左右镜像功能,接下来就来分析下拍照保存图片的流程 2.Camera2 拍照镜像功能实…

JDK17新特性,代码使用,作用详细讲解

目录 1.密封类和密封接口 作用 好处 1. 密封类 2. 密封接口 3. 非密封类 4. 抽象密封类 2.模式匹配for instanceof JDK17前的jdk版本 新JDK17 特性与优点 使用示例 注意事项 作用 3.文本块 作用 好处 代码实例 1. 基本语法&#xff1a; 2.换行和缩进&#xff1a; 3.包…

SQL 干货 | SQL 反连接

最强大的 SQL 功能之一是 JOIN 操作&#xff0c;它提供了一种优雅而简单的方法&#xff0c;将一个表中的每一条记录与另一个表中的每一条记录结合起来。不过&#xff0c;有时我们可能想从一个表中找到另一个表中没有的值。正如我们将在今天的博客文章中看到的&#xff0c;通过包…

Vue中v-bind对样式控制的增强—(详解v-bind操作class以及操作style属性,附有案例+代码)

文章目录 v-bind对样式控制的增强2.1 操作class2.1.1 语法2.1.2 对象语法2.1.3 数组语法2.1.4 使用2.1.5 Test 2.2 操作style2.2.1 语法2.2.2 使用2.2.3 Test v-bind对样式控制的增强 2.1 操作class 2.1.1 语法 <div> :class "对象/数组">这是一个div&l…

图片无损放大工具Topaz Gigapixel AI v7.4.4 绿色版

Topaz A.I. Gigapixel是这款功能齐全的图象无损变大运用&#xff0c;应用可将智能机拍摄的图象也可以有着专业相机的高质量大尺寸作用。你可以完美地放大你的小照片并大规模打印&#xff0c;它根本不会粘贴。它具有清晰的效果和完美的品质。 借助AIGigapixel&#xff0c;您可以…

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(3)

1.问题描述&#xff1a; compatibleSdkVersion升级到5.0.0&#xff08;12&#xff09;之后&#xff0c;调用坐标系转换API&#xff1a;map.convertCoordinate(mapCommon.CoordinateType.WGS84, mapCommon.CoordinateType.GCJ02, { longitude: location.longitude, latitude:…

[Linux网络编程]01-网络基础

此部分为《计算机网络》理论基础&#xff0c;可简要了解 一.计算机网络体系结构 常见的体系结构 OSI体系结构(法律上的国际标准)&#xff1a;物理层->数据链路层->网络层->运输层->会话层->表示层->应用层 TCP/IP体系结构(事实上的国际标准)&#xff1a;…

web网页QQ登录

代码&#xff1a; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>QQ登录ent</title> </head> <style>ul > li{list-style: none; } a …

【Linux】 Linux 释放内存脚本

在Linux系统中&#xff0c;通常不需要手动释放内存到操作系统&#xff0c;因为Linux内核会自动管理内存。不过在经常会遇到内存不足&#xff0c;系统应用运行效率低的情况 编写一个脚本来“释放”内存&#xff0c;可以通过调用sync命令同步磁盘&#xff0c;并通过echo命令写入特…

13.1 Linux_网络编程_TCP/UDP

字节序 1、概述 什么是字节序&#xff1a; 字节序就是字节的存储顺序&#xff0c;分为大端字节序和小端字节序。 大端字节序&#xff1a;低地址存高位&#xff08;网络&#xff09;小端字节序&#xff1a;低地址存低位&#xff08;主机&#xff09; 检验主机字节序模式&…

【Linux】-权限

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;深入代码世界&#xff0c;了解掌握 Linux 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ​ 一、权限的概念 在Linux 中&…

开源图像超分ECBSR项目源码分析

相关介绍 项目GitHub地址&#xff1a;https://github.com/xindongzhang/ECBSR项目相关论文&#xff1a;https://www4.comp.polyu.edu.hk/~cslzhang/paper/MM21_ECBSR.pdf&#xff08;也可以点这里下载&#xff09;论文解读&#xff1a;Edge-oriented Convolution Block for Re…

秃姐学AI系列之:语义分割 + 数据集 | 转置卷积 + 代码

语义分割 语义分割将图片中的每个像素分类到对应的类别 通常来说现在的会议软件的背景虚化这个功能用的就是语义分割技术 无人车进行路面识别也是语义分割技术 语义分割 vs 实例分割 语义分割将图像划分为若干组成区域&#xff0c;这类问题的方法通常利用图像中像素之间的相关…

go中阶乘实现时递归及迭代方式的比较

package mainimport ("fmt""time""math/big" )// 使用递归和 big.Int 计算阶乘 func FactorialRecursive(n *big.Int) *big.Int {if n.Cmp(big.NewInt(0)) 0 {return big.NewInt(1)}return new(big.Int).Mul(n, FactorialRecursive(new(big.Int…

基于Multisim三极管B放大系数放大倍数测量电路设计(含仿真和报告)

【全套资料.zip】三极管B放大系数放大倍数测量电路电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.用三个数码管显示B的大小&#xff0c;分别显示个位、十位和百位。 2.显示范围…

【论文精炼分享】GPU Memory Exploitation for Fun and Profit 24‘USENIX

今天分享的论文《GPU Memory Exploitation for Fun and Profit》来自2024年USENIX Security。在本文中&#xff0c;作者团队对 CUDA 程序中的缓冲区溢出问题进行了全面的研究&#xff1a; &#xff08;1&#xff09;对用于访问各种 GPU 内存空间的机制进行了逆向工程&#xff…

纯css 轮播图片,鼠标移入暂停 移除继续

核心 滚动&#xff1a; animation: 动画名称 20s linear infinite normal;停止&#xff1a; animation: 动画名称 20s linear infinite paused; 完整例子&#xff1a; html: <div class"carousel-wrapper"><div class"carousel"><div cl…

Docker学习笔记(2)- Docker的安装

1. Docker的基本组成 镜像&#xff08;image&#xff09;&#xff1a;Docker镜像就像是一个模板&#xff0c;可以通过这个模板来创建容器服务。通过一个镜像可以创建多个容器。最终服务运行或者项目运行就是在容器中。容器&#xff08;container&#xff09;&#xff1a;Docker…

【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不多说…