数据结构和算法——了解哈希表(哈希查找、散列的基本思想)

news2024/12/23 14:38:23

目录

哈希查找

散列的基本思想

例一

例二 


哈希查找

我们之前学过的几种查找方法:

  • 顺序查找        O(N)
  • 二分查找(静态查找)        O({log_{2}}^{N})
  • 二叉搜索树        O(h)    h为二叉查找树的高度
  • 平衡二叉树        O({log_{2}}^{N})

还有没有更快的查找方法呢?

我们先看下面的例子:

在登陆QQ的时候,QQ服务器是如何核对你的身份的?面对庞大的用户群,如何快速找到用户信息

 如果用二分法查找:

  • 十亿(10^9\approx 2^{30})有效用户,所以用二分法查找30次。
  • 十亿(10^9\approx 2^{30}\times1K\approx 1024G,也就是需要1T的连续空间。
  • 按有效QQ号大小有序存储:在连续存储空间中,插入和删除一个新的QQ号码将需要移动大量数据

如何快速搜索到需要的关键词呢?如果关键词不方便比较怎么办?

我们看看查找的本质:已知对象找位置

  • 有序安排对象:全序、半序
  • 直接“算出”对象位置:散列

于是我们引进哈希查找法。

哈希查找法的两项基本工作:

  • 计算位置:构造哈希函数确定关键词存储位置;
  • 解决冲突:应用某种策略解决多个关键词位置相同的问题。

时间复杂度几乎是常量:O(1),即查找时间与问题规模无关。

散列的基本思想

  1. 以关键字key为自变量,通过一个确定的函数h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址。
  2. 可能不同的关键字会映射到同一个散列地址上,即h(key_i)=h(key_j)(当key_i\neq key_j

,称为“冲突(Collision)”。——需要某种冲突解决策略

例一

有n = 11个数据对象的集合{ 18,23,11,20,2,7,27,30,42,15,34 }。

 哈希表的大小用TableSize = 17,选取哈希函数h如下:

h(key) = key\: \: mod\: \: TableSize(取余)

因为18 % 17 = 1,所以h(18) = 1

因为23 % 17 = 6,所以h(23) = 6

因为11 % 17 = 11,所以h(11) = 11

......

得到:

地址012345678910111213141516
关键词34182202374227113015

假设新插入35,h(35) = 1,该位置已有对象,冲突!(在后面我们将讨论怎么解决冲突)

查找:

  • key = 22,h(22) = 5,该地址空,不在表中
  • key = 30,h(30) = 13,该地址存放是30,故而找到了。

补充:

装填因子(Loading Factor):设散列表空间大小为m,填入表中元素个数是n,则称\alpha =n/m为散列表的装填因子。

\alpha = 11/17\approx 0.65

例二 

将acos、define、float、exp、char、atan、ceil、floor,顺次存入一张散列表中。

散列表设计为一个二维数组Table[26][2],2列分别代表2个槽。

设计散列函数 h(key) = key[ 0 ] - ‘a’

槽0槽1
0acosatan
1
2charceil
3define
4exp
5floatfloor
6
......
25

如果没有溢出,

T_{inquire} = T_{insert} = T_{delete} = O(1)


end 


学习自:MOOC数据结构——陈越、何钦铭

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

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

相关文章

安卓:实现复制粘贴功能

目录 一、介绍 (一)ClipboardManager介绍 1、ClipboardManager常用方法: 2、获取 ClipboardManager实例 (二)、ClipData介绍 1、创建ClipData对象: 2、获取ClipData的信息: 3、ClipData…

原型链污染攻击

原型链污染攻击 prototype 和 _proto_是什么 JavaScript中的类的简历 在JavaScript中,我们如果要定义一个类,需要以定义“构造函数”的方式来定义: function Foo() {this.bar 1 }new Foo() 解析: Foo函数的内容,就…

【Redis】——AOF持久化

什么是AOF日志 AOF日志是redis为数据的持久化提供了的一个技术,日志里面记录着执行redis写命令。每当redis执行一条写命令的时候,就会将该命令记录 到AOF日志当中。当redis启动的时候,可以加载AOF日志中的所有指令,并执行这些指令恢复所有的…

RocketMQ基本概念和高级原理

基础概念 消息模型 RocketMQ 主要由 Producer、Broker、Consumer 三部分组成,其中 Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个 Topic…

ubuntu搭建wifi热点,共享网络(x86、arm相同)

目录 1 首先检查网络管理器服务是否开启 (ubuntu需要界面) 2 创建并配置需要共享的wifi 首先,明确下这篇文章说的是啥,是为了在ubuntu系统的电脑上,搭建一个wifi热点,供其他移动设备连接上网。就像你…

使用隧道HTTP时如何解决网站验证码的问题?

使用代理时,有时候会遇到网站验证码的问题。验证码是为了防止机器人访问或恶意行为而设置的一种验证机制。当使用代理时,由于请求的源IP地址被更改,可能会触发网站的验证码机制。以下是解决网站验证码问题的几种方法: 1. 使用高匿…

android AIDL 学习使用

在android studio 2023.2中使用 1、在buidl.gradle增加以下配置,然后同步。不增加这些配置,创建aidl时显示为灰色,不能创建 buildFeatures {compose true// Disable unused AGP featuresbuildConfig falseaidl truerenderScript falseresVal…

手眼标定眼在手上

1、为什么要用手眼标定(在贴片机上定位已调通) 参考手眼标定特别是眼在手上在网上的文章很多,但很多在实际中调试不通。在定位时候,往往希望相机能返回的是机械的世界坐标,而不是相机的的图像坐标。从而间接计算出相机…

JavaWeb三大组件 —— Servlet

目录 servlet 注册servlet 父pom pom文件 1、通过注解注册 2、使用ServletRegistrationBean注册 API三生三世 第一生Servlet 第二生SpringMVC 今生SpringBoot servlet Servlet的作用: 接受请求参数、处理请求,响应结果,(就…

Qlik Sense 移动端安装配置

在之前的文章中,我们了解到Qlik Sense是一款数据分析可视化的应用,使人们能够轻松地组合来自许多不同来源的数据,并自由探索,而不受基于查询的工具的限制。不仅支持Web端访问,还有配套的Windows Desktop使用&#xff0…

最新2024届【海康威视】内推码【GTK3B6】

最新2024届【海康威视】内推码【GTK3B6】 【内推码使用方法】 1.请学弟学妹们登录校招官网,选择岗位投递简历; 2.投递过程中填写内推码完成内推步骤,即可获得内推特权。 内推码:GTK3B6 内推码:GTK3B6 内推码&…

边写代码边学习之RNN

1. 什么是 RNN 循环神经网络(Recurrent Neural Network,RNN)是一种以序列数据为输入来进行建模的深度学习模型,它是 NLP 中最常用的模型。其结构如下图: x是输入,h是隐层单元,o为输出&#xff…

有哪些好用的AI绘画网站?

随着人工智能技术的发展,人工智能绘画工具逐渐成为数字艺术领域的热门话题。人工智能绘画工具是利用深度学习和其他技术来模拟绘画过程和效果的工具,可以帮助用户快速创作高质量的艺术作品。除了Midjourney、除了openai等流行的AI绘画工具外,…

Flutter游戏引擎Flame系列笔记 - 1.Flame引擎概述

Flutter游戏引擎Flame系列笔记 1.Flame引擎概述 - 文章信息 - Author: 李俊才(jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/132119035 【介绍】…

【微信小程序创作之路】- 小程序远程数据请求、获取个人信息

【微信小程序创作之路】- 小程序远程数据请求、获取个人信息 第七章 小程序远程数据请求、获取个人信息 文章目录 【微信小程序创作之路】- 小程序远程数据请求、获取个人信息前言一、远程数据请求1.本地环境2.正式域名 二、获取用户个人信息1.展示当前用户的身份信息2.获取用…

Vue电商项目--导航守卫

导航守卫理解 导航 守卫 导航:表示路由正在发送改变,进行路由跳转 守卫:你把它当中‘紫禁城守卫’ 全局守卫:你项目中,只要路由变化,守卫就能监听到。 举例:紫禁城【皇帝,太子】…

sk_buff操作函数学习

一. 前言 内核提供了大量实用的操作sk_buff的函数,在开发网络设备驱动程序和修改网络协议栈代码时需要用到。这些函数从功能上可以分为三类:创建,释放和复制socket buffer;操作sk_buff结构中的参数和指针;管理socket b…

XML 学习笔记 7:XSD

本文章内容参考自: W3school XSD 教程 Extensible Markup Language (XML) 1.0 (Second Edition) XML Schema 2001 XML Schema Part 2: Datatypes Second Edition 文章目录 1、XSD 是什么2、XSD 内置数据类型 - built-in datatypes2.1、基本数据类型 19 种2.1.1、基本…

从0到1自学网络安全(黑客)【附学习路线图+配套搭建资源】

前言 网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的…

【STM32】小电流FOC驱控一体板(开源)

FOC驱控一体板 主控芯片stm32f103c8t6 驱动芯片drv8313 三相电流采样 根据B站一个UP主的改的(【【自制】年轻人的第一块FOC驱动器】),大多数元器件是0805,实验室具备且便于自己动手焊接 。 晶振用的是无源晶振,体…