理解Hash表

news2024/11/16 13:45:11

注:本文翻译自 https://www.baeldung.com/cs/hash-tables

1 介绍

有效管理数据的技术是计算机科学的传统热点。除了存储数据之外,从存储中高效地恢复数据是另一个相关问题。

即使使用最好的算法处理某些特定的数据,如果没有优化数据管理,我们的性能也会很差。因此,恢复和向算法提供数据以及保存其输出成为性能瓶颈。

随着时间的推移,已经提出了几种保存和管理数据的技术。例如数组、链表、树和图。这些数据结构非常适合多种用途。但是,查找和恢复存储在它们中的数据的时间复杂度通常高于另一种数据结构:哈希表。

因此,本教程将探讨与散列表有关的最相关的概念。首先,我们将简要回顾一下哈希。因此,我们将学习哈希表及其工作原理。接下来,我们将看到如何解决一些关于哈希冲突的潜在问题。最后,我们将比较哈希表与其他数据结构的数据管理复杂性。

2 哈希基础

在具体学习哈希表之前,我们需要了解哈希。总而言之,哈希是接受可变长度的输入并产生固定长度的输出值的过程,称为哈希码或简称哈希。

散列函数负责将可变长度的输入转换为散列。没有标准的哈希函数。这意味着我们可以根据数据输入的一般预期特征来开发哈希函数。

下面的图片在一个高层次上描述了哈希机制是如何工作的:

在这里插入图片描述

值得注意的是,散列函数可以增加或减少可变长度输入的字节数。因此,如果输入大于哈希码,字节数将减少。否则,它会增加。

简而言之,散列在计算机科学中有几种应用,例如存储和验证密码、创建消息签名以及提供数据管理结构(本教程的主要主题)。

3 哈希表

哈希表是将特定键与相应值关联起来的数据结构。这些表通常使用关联数组来实现,以存储数据。此外,它们使用哈希函数来计算应该将数据存储在数组的哪一点(索引)。

因此,我们可以将哈希表理解为键值查找。因此,给定一个与值(数据)相关联的键,我们可以通过对表的快速查找来恢复相应的值。

例如,我们可以用哈希表将人们的姓名与其个人信息关联起来。这样,人们的名字就是我们的原始钥匙。哈希函数处理这些原始键以确定它们在哈希表中的相应索引,从而提供对个人信息的直接访问。

下图描述了哈希表及其处理过程,如上一段所述:

在这里插入图片描述

随着时间的推移,哈希表在计算场景中变得非常流行。因此,不同的编程语言开始努力在本地或通过内置库提供这种数据结构。

已开发结构的例子有Java中的HashMaps、Python中的dict类(字典)、c++中的map类和Lisp中的list。

哈希表是时间-空间权衡的好例子。如果可用时间是无限的,我们只能将所有键都链接到同一个索引,并执行二进制搜索来恢复特定的数据。

另一方面,如果空间是无限的,我们可以使用完整键作为索引本身,拥有尽可能多的单独内存桶来存储与键对应的数据。

然而,在现实世界中,我们并没有无限的时间或空间。因此,我们将最终处理哈希冲突和索引共享,如下面的小节所述。

3.1 哈希表中的冲突

由于哈希函数将可变长度的键映射到固定长度的索引,因此它们实际上将无限集映射到有限集。以这种方式,碰撞最终会发生。

在哈希表中,冲突意味着哈希函数将多个所需的键映射到相同的索引,从而映射到表的相同内存桶。

因此,提出了许多技术来处理碰撞。我们将简要介绍其中最相关的:

  • 单独链表:单独链表技术通过在哈希表的内存桶中支持链表来解决冲突。因此,映射到相同内存桶的数据(键生成相同的索引)被附加到链表中
  • 线性探测:也称为开放寻址,这种技术处理冲突,找到确定的具有空闲内存桶以插入数据的索引的第一个索引
  • 调整大小和复制:一个简单的技术,调整哈希表的大小,并在碰撞发生时重新分配数据。这个过程的目的是解决一个即时的碰撞问题,并避免在不久的将来发生其他碰撞

4 数据管理的复杂性

哈希表在数据管理方面是一个很好的结构。该数据结构采用的键值方案直观,适合不同场景的多个数据。

此外,在哈希表中搜索、插入和删除数据的平均复杂度是O(1)——一个常数时间。这意味着,无论目标操作是什么,平均而言,单个哈希表查找就足以找到所需的内存桶。

然而,这些操作的最坏情况通常是O(n) -线性时间。当哈希表中的所有数据都具有映射到相同索引的键时,就会出现这种情况。

在这个场景中,哈希表将不断执行一种技术来解决冲突。其中一些技术,如单独链表和线性探测,需要额外的时间来扫描列表或表本身,从而增加了最坏情况下的时间复杂度。

但是,设计良好的哈希表通常很少出现冲突。因此,这种数据结构仍然是保存和提供数据的通用且灵活的选择。

4.1 比较哈希表和其他数据结构

当然,除了哈希表之外,我们还有其他数据结构来管理数据。一个传统的例子是无序链表。在我们的讨论中,让我们考虑一个双链结循环列表的实现。

在链表中,插入和删除一个给定的元素非常简单。最简单的插入操作是追加操作。通过定义的操作次数,我们可以在常量时间(O(1))内向链表添加一个新元素。类似地,给定一个要删除的元素,可以在常数时间内(O(1))执行该操作。

这里需要强调的是,我们认为指向元素的指针已经可用,可以在列表中添加或删除该元素。

然而,关于链表最具挑战性的是搜索特定的元素。在这种情况下,平均复杂度为O(n)。这是因为我们需要检查每个列表元素,直到找到一个特定的元素。

我们可以采用其他技术来降低搜索复杂度,比如二分搜索。但是,在这种情况下,我们需要一个有序的链表,这增加了向列表中插入元素的复杂性。

让我们考虑一个有序的双链循环表。如果我们用插入排序算法保持列表有序,我们的插入复杂度为O(n);删除复杂度仍为O(1);使用二分查找来查找元素,我们的搜索复杂度是O(log n)

下表比较了无序列表、有序列表和哈希表插入、删除和搜索操作的平均时间复杂度:

在这里插入图片描述

5 结论

在本教程中,我们学习了哈希表。首先,我们回顾了哈希。因此,我们探索了哈希表的数据结构。在这个上下文中,我们研究了在哈希表中插入、删除和搜索数据的时间复杂度。最后,我们比较了哈希表中这些操作与其他数据管理结构的时间复杂度。

我们可以看到,对于所有考虑的数据管理操作,哈希表具有诱人的平均时间复杂度。特别是,恒定的搜索时间复杂度使得哈希表成为减少算法中循环次数的绝佳资源。

最后,尽管在最坏的情况下具有线性时间复杂度,但平衡良好的哈希函数和维数良好的哈希表自然会避免冲突。所以,最坏情况下的时间复杂度不会发生。

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

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

相关文章

Linux C语言开发-D2vi编辑器使用

三种模式基础 命令行模式、插入模式和底行模式 :! [命令]:可在命令行模式下执行命令 :w test1.cc可备份当前编辑的文件 :r head.h可为当前文件引入头文件 u:撤销 命令行进入插入模式: i:从当前光标位置之前开始插入 …

mac安装+配置python3环境

一、python3下载 官网下载 https://www.python.org/ 二、python3安装 打开下载好的.pkg文件一直继续确认即可。 三、验证是否安装成功 打开终端,输入python3,如果返回python对应的版本信息,则安装成功。 四、python配置 如果需要输入…

c语言刷题(第8周)

输入整数m,n(m<n),输出[m,n]之间所有能被3,不能被4整除的所有数并求和,输出时每行显示5个数。 题干输入整数m,n(m<n),输出[m,n]之间所有能被3,不…

【深蓝学院】手写VIO第7章--VINS初始化和VIO系统--作业

0. 内容 1. T1 1. 下载EuRoc数据集(optional) 因为作业主要使用Ch2生成的数据,所以这一步也是可选的,但是为了整个系统的bring up,可以先用EuRoc数据集跑起来。 下载EuRoc数据集,SLAM相关数据集链接 2.…

windows平台下Qt Creator的下载与安装流程

下载 下载地址:https://download.qt.io/archive/ 下载界面 进入qt或者qtcreator都可以 版本选择 这里我选择进入qt进行下载,进入之后有多个版本可以选择。 注意:从Qt5.15版本开始,Qt公司不在提供开源离线安装程序,此…

2.6.C++项目:网络版五子棋对战之数据管理模块-游戏房间管理模块的设计

文章目录 一、意义二、功能三、作用四、游戏房间类基本框架五、游戏房间管理类基本框架七、游戏房间类代码八、游戏房间管理类代码 一、意义 对匹配成功的玩家创建房间,建立起一个小范围的玩家之间的关联关系! 房间里一个玩家产生的动作将会广播给房间里…

寻找一罐app里的隐藏海

一、前言 (一)一罐app简介 一罐app 是一款小众交友软件,可以匿名or真身发布动态 (二)开发目的 因为某些原因,某些板块被隐藏起来了。(一罐称板块为xxx海) (三&#…

常见面试题-Netty专栏(一)

typora-copy-images-to: imgs Netty 是什么呢?Netty 用于做什么呢? 答: Netty 是一个 NIO 客户服务端框架,可以快速开发网络应用程序,如协议服务端和客户端,极大简化了网络编程,如 TCP 和 UDP …

手搭手Ajax经典基础案例省市联动

环境介绍 技术栈 springbootmybatis-plusmysql 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http:/…

MYSQL(事务+锁+MVCC+SQL执行流程)理解

一)事务的特性: 一致性:主要是在数据层面来说&#xff0c;不能说执行扣减库存的操作的时候用户订单数据却没有生成 原子性:主要是在操作层面来说&#xff0c;要么操作完成&#xff0c;要么操作全部回滚&#xff1b; 隔离性:是自己的事务操作自己的数据&#xff0c;不会受到到其…

有哪些好用的程序员接私活平台?

程序员如何在苦逼的生活中&#xff0c;呼吸一口富贵又自由的空气? 接单的话&#xff0c;如何脱颖而出&#xff1f; 又该用什么平台呢&#xff1f;哪些平台会更靠谱一点呢&#xff1f; 会不会被坑? balabalabalabala......太多问题了&#xff0c;核心还是不了解这里面的详情。…

从理解概念开始,彻底学会linux下的磁盘扩容操作

对于linux磁盘空间不足需要扩容的情况&#xff0c;其他文章一般只介绍要如何操作&#xff0c;使用什么样的命令&#xff0c;但是不去介绍为什么要这么做&#xff0c;搞得好多小白一头雾水。本文从linux的文件系统开始讲起&#xff0c;帮你彻底学会linux系统中的磁盘扩容操作。 …

科学指南针iThenticate自助查重系统重磅上线

科学指南针&#xff0c;一直致力于为科研工作者提供高效、专业的学术支持&#xff0c;近日推出了全新的iThenticate自助查重系统。这一系统的上线&#xff0c;旨在为广大科研工作者提供更加便捷、准确的论文查重服务&#xff0c;进一步规范英文使用&#xff0c;提升科研质量。 …

使用Packstack安装器安装一体化OpenStack云平台

【实训目的】 初步掌握OpenStack快捷安装的方法。掌握OpenStack图形界面的基本操作。 【实训准备】 &#xff08;1&#xff09;准备一台能够安装OpenStack的实验用计算机&#xff0c;建议使用VMware虚拟机。 &#xff08;2&#xff09;该计算机应安装CentOS 7&#xff0c;建…

【网络协议】聊聊网络路由相关算法

如何配置路由 路由器是一台网络设备&#xff0c;多张网卡&#xff0c;当一个入口的网络包到达路由器时&#xff0c;会根据本地的信息库决定如何正确的转发流量&#xff0c;通常称为路由表 路由表主要包含如下 核心思想是根据目的 IP 地址来配置路由 目的网络&#xff1a;要去…

电影评分数据分析案例-Spark SQL

# cording:utf8from pyspark.sql import SparkSession from pyspark.sql.types import IntegerType, StringType, StructType import pyspark.sql.functions as Fif __name__ __main__:# 0.构建执行环境入口对象SparkSessionspark SparkSession.builder.\appName(movie_demo)…

DDOS直接攻击系统资源

DDOS ——直接攻击系统资源 思路&#xff1a; 攻击机利用三次握手机制&#xff0c;产生大量半连接&#xff0c;挤占受害者系统资源&#xff0c;使其无法正常提供服务。 1、先体验下受害者的正常网速。在受害者主机上执行以下命令 (1)开启Apache。 systemctl start apache2 (2…

C++数据结构X篇_20_选择排序

文章目录 1. 选择排序原理2. 选择排序原理核心代码3. 选择排序时间消耗 1. 选择排序原理 选择排序&#xff1a;相对于冒泡排序&#xff0c;减少了交换次数&#xff0c;下图展示了选择排序的原理&#xff0c;具体仍需要结合代码分析。 2. 选择排序原理核心代码 //选择排序 v…

运行报错(三)git bash报错fatal: detected dubious ownership in repository at

报错现象 在运行git 命令时&#xff0c;出现报错 “fatal: detected dubious ownership in repository at” 报错原因 文件夹的所有者和现在的用户不一致 栗子&#xff1a; 文件夹的所有者是root&#xff0c;而当前用户是admin 解决方案 方法一、 将文件夹的所有者替换成ad…

九章云极DataCanvas公司入选Forrester AI/ML权威报告

日前&#xff0c;全球研究机构Forrester最新发布了《The Forrester Wave™: AI/ML Platforms In China, Q4 2023》报告&#xff08;以下简称“报告”&#xff09;。凭借DataCanvas APS机器学习平台这一人工智能核心基础软件的持续研发和广泛应用&#xff0c;九章云极DataCanvas…