算法通关村第5关【青铜】| Hash和队列的特征

1.Hash基础

(1)基础

哈希也称为散列,通过算法变成固定长度的输出值,存入对应的位置

例如这个算法为取模算法,index=number 模 7

存入1到15

image.png

(2)碰撞处理

当多个元素映射到同一位置上时就产生了碰撞

哈希碰撞处理是在使用哈希函数时,不同的键可能映射到相同的哈希值(哈希冲突)时的解决方法。哈希碰撞处理是为了确保不同的键可以在哈希表中正确存储和检索,从而维护哈希表的性能和正确性。

以下是几种常见的哈希碰撞处理方法:

  1. 链地址法(Chaining): 这是一种常见的方法,通过在哈希桶位置上维护一个链表(或其他数据结构),将发生冲突的键值对添加到链表中。在查找或删除操作时,遍历链表来找到对应的键值对。

  2. 开放定址法(Open Addressing): 在这种方法中,当发生冲突时,会顺序地在哈希表中的其他位置寻找空闲的位置来存储键值对。这包括线性探测、二次探测、双重哈希等策略。

  3. 再哈希法(Rehashing): 当发生冲突时,计算另一个哈希函数,然后将键值对存储在新的哈希桶位置上。这可以有效地减少冲突。

  4. 建立一个“桶”的链表: 这是一种类似于链地址法的方法,但不是在每个哈希桶位置上维护一个链表,而是在发生冲突的哈希桶位置上维护一个链表。

  5. 完全二叉树: 将键值对按照哈希值顺序存储在完全二叉树的节点上。这种方法在特定情况下可以提供较好的性能。

开放定址法

开放定址法的主要思想是,当发生哈希冲突时,不仅仅将数据存储在哈希桶中,而是根据某种算法找到一个不冲突的位置,将数据存储在那里。这就需要一个探测序列(probing sequence),它是一系列指示位置的步骤,用于寻找下一个可用的位置。

常见的开放定址法包括:

  1. 线性探测(Linear Probing): 在发生冲突时,按顺序检查下一个位置,直到找到一个空闲位置为止。

  2. 二次探测(Quadratic Probing): 在发生冲突时,按照某个步长的平方逐渐增加位置,直到找到一个空闲位置为止。

  3. 双重散列(Double Hashing): 在发生冲突时,使用第二个哈希函数计算一个步长,然后在哈希表中逐渐增加位置,直到找到一个空闲位置为止。

开放定址法的优点是它对于内存的利用更有效,因为数据存储在数组中,没有额外的指针。然而,它在负载因子高时可能会导致聚集现象(clustering),即一些位置上会有很多连续的元素,而其他位置则很少使用。这可能会降低性能。

链地址法

"链地址法"(Chaining)是一种哈希表解决哈希冲突的方法之一。在哈希表中,不同的键可能会映射到相同的哈希桶位置,这就产生了哈希冲突。链地址法通过在每个哈希桶位置上维护一个链表(或其他数据结构)来处理这种冲突。

具体来说,当发生哈希冲突时,链地址法将冲突的键值对添加到哈希桶位置对应的链表中。每个链表节点包含一个键值对。当需要插入、查找或删除一个键值对时,先计算哈希值找到对应的哈希桶位置,然后在该位置的链表中进行操作。

以下是链地址法的基本步骤:

  1. 插入: 计算键的哈希值,找到对应的哈希桶位置。如果该位置为空,则在该位置插入键值对。如果该位置已经有其他键值对存在(即发生冲突),则在链表中继续插入新的键值对。

  2. 查找: 计算键的哈希值,找到对应的哈希桶位置。然后遍历链表,查找包含该键的节点。

  3. 删除: 计算键的哈希值,找到对应的哈希桶位置。然后遍历链表,找到包含该键的节点,并进行删除操作。

链地址法的优点是它相对简单,可以有效地解决哈希冲突。然而,当哈希冲突较多时,链表可能会变得较长,导致操作的时间复杂度增加。为了保持哈希表的高效性能,需要根据数据分布情况来选择合适的哈希函数,并根据情况动态调整哈希桶的数量。另外,当链表过长时,可以考虑使用更高效的数据结构,如红黑树,来替代链表,以提高查找效率。

2.队列基础

FIFO先进先出的线性表

基于链表实现

尾插+头删

public class MyLinkQueue {static class Node {public int data;public Node next;public Node(int data) {this.data = data;}}private Node front;private Node rear;private int size;//无参构造初始化public MyLinkQueue() {this.front = null;this.rear = null;}public boolean isEmpty() {return front == null;}//尾插public void push(int data){Node node = new Node(data);if (isEmpty()){front = node;rear = node;}else{rear.next = node;rear = node;}size++;}//头删public int pop(){if (isEmpty()){throw new EmptyStackException();}int res = front.data;front = front.next;size--;return res;}public int size(){return size;}public void traverse(){Node t = front;while(t!=null){System.out.println(t.data);t = t.next;}}public static void main(String[] args) {MyLinkQueue queue = new MyLinkQueue();queue.push(10);queue.push(20);queue.push(30);System.out.println("Queue elements:");queue.traverse(); // Output: 10 20 30System.out.println("Dequeued element: " + queue.pop()); // Output: 10System.out.println("Queue size: " + queue.size()); // Output: 2queue.push(40);queue.push(50);System.out.println("Queue elements:");queue.traverse(); // Output: 20 30 40 50System.out.println("Queue size: " + queue.size()); // Output: 4}}

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

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

相关文章

API 接口选择那个?RESTful、GraphQL、gRPC、WebSocket、Webhook

大家好,我是比特桃。目前我们的生活紧紧地被大量互联网服务所包围,互联网上每天都有数百亿次API调用。API 是两个设备相互通讯的一种方式,人们在手机上每次指尖的悦动,背后都是 API 接口的调用。 本文将列举常见的一些 API 接口&…

利用console提高写bug的效率

前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 自从入坑前端后,日常写bug就没离开过console。 要说用得多,不如说是console.log用得多,console.warn和console.erro…

2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比较

文章目录 React:构建用户界面的首选Vue:简单优雅的前端框架Angular:Google支持的全面框架Node.js:服务器端的JavaScript运行环境比较不同框架的优势与劣势React:Vue:Angular:Node.js&#xff1a…

怎么查看小程序中的会员信息

商家通过查看会员信息,可以更好地了解用户,并为他们提供更个性化的服务和推荐。接下来,就将介绍如何查看会员信息。 商家在管理员后台->会员管理处,可以查看到会员列表。支持搜索会员的卡号、手机号和等级。还支持批量删除会员…

【Python】数据分析工具之各种图

1 漏斗图 漏斗图描述状态阶段的顺序递进关系,属于序列类图表 import plotly.express as pxdata dict(number[39, 27.4, 20.6, 11, 2],stage["Website visit", "Downloads", "Potential customers", "Requested price", &…

K8s+Docker+KubeSphere+DevOps笔记

K8sDockerKubeSphereDevOps 前言一、阿里云服务器开通二、docker基本概念1.一次构建、到处运行2、docker基础命令操作3、docker进阶操作1.部署redis中间件2.打包docker镜像 三、kubernetes 大规模容器编排系统1、基础概念:1、服务发现和负载均衡2、存储编排3、自动部…

QTreeWidget——信号处理

文章目录 基本属性信号一、信号种类二、信号测试1、currentItemChanged、itemCollapsed、itemExpanded三个信号的测试2、itemActivated信号3、 itemChanged信号4、其余信号的测试代码(包含以上代码) 基本属性 信号 一、信号种类 //当前项发生变化时触…

uniapp 顶部头部样式

<u-navbartitle"商城":safeAreaInsetTop"true"><view slot"left"><image src"/static/logo.png" mode"" class"u-w-50 u-h-50"></image></view></u-navbar>

使用Pandas处理Excel文件

Excel工作表是非常本能和用户友好的&#xff0c;这使得它们非常适合操作大型数据集&#xff0c;即使是技术人员也不例外。如果您正在寻找学习使用Python在Excel文件中操作和自动化内容的地方&#xff0c;请不要再找了。你来对地方了。 在本文中&#xff0c;您将学习如何使用Pan…

怎样做好日志分析?

首先我们要知道日志分析是指检查并理解计算机生成的日志消息&#xff0c;例如日志事件或审计来跟踪记录&#xff0c;通过日志分析可以帮助您诊断和解决计算机系统中的问题&#xff0c;以及监视系统性能和安全性。 如果您想知道您的网络中发生了什么&#xff0c;以便洞察潜在的…

【JUC】线程池ThreadPoolTaskExecutor与面试题解读

1、ThreadPoolTaskExecutor 创建线程池 从它的创建和使用说起&#xff0c;创建和使用的代码如下&#xff1a; 创建&#xff1a; ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize…

Java之继承详解二

3.7 方法重写 3.7.1 概念 方法重写 &#xff1a;子类中出现与父类一模一样的方法时&#xff08;返回值类型&#xff0c;方法名和参数列表都相同&#xff09;&#xff0c;会出现覆盖效果&#xff0c;也称为重写或者复写。声明不变&#xff0c;重新实现。 3.7.2 使用场景与案例…

Spring复习:(55)ApplicationContext中BeanFactoryPostProcessor是怎么添加到容器的?

容器创建时会调用AbstractApplicationContext的refresh方法&#xff0c;其中会调用invokeBeanFactoryPostProcessor方法&#xff0c;如下图 invokeBeanFactoryPostProcessors代码如下&#xff1a; 其中调用的PostProcessorRegistrationDelegate的invokeBeanFactoryPostProcess…

计算机竞赛 交通目标检测-行人车辆检测流量计数 - 计算机竞赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

【Flutter】Flutter 使用 font_awesome_flutter 展示图标

【Flutter】Flutter 使用 font_awesome_flutter 展示图标 文章目录 一、前言二、安装和基本使用1. 安装2. 基本使用示例3. 图标的命名和样式 三、自定义图标和高级功能1.动态检索图标2.排除样式和优化 四、完整示例五、总结 一、前言 在现代移动应用开发中&#xff0c;图标起着…

C语言入门 Day_8数据与运算小结

目录 前言 1.精度 2.运算 2.易错点 3.思维导图 前言 到目前为止我们一共学习了四种数据类型&#xff0c;他们分别是表示整数的整型&#xff1b;表示小数的浮点型&#xff1b;表示字符的字符型&#xff1b;和表示布尔数的布尔型。 表示整数的整型&#xff0c;它的变量类型名…

浅谈泛在电力物联网在电力设备状态在线监测中的应用

安科瑞 华楠 摘要&#xff1a;随着信息化水平的不断发展&#xff0c;泛在电力物联网的建设提上日程&#xff0c;这对提升变电站电力设备在线监测水平&#xff0c;推动智能电网发展具有重要的指导意义。对基于物联网的电力设备状态监测系统进行了研究&#xff0c;概括了泛在电力…

Android TV开发之VerticalGridView

Android TV应用开发和手机应用开发是一样的&#xff0c;只是多了焦点控制&#xff0c;即选中变色。 androidx.leanback.widget.VerticalGridView 继承 BaseGridView &#xff0c; BaseGridView 继承 RecyclerView 。 所以 VerticalGridView 就是 RecyclerView &#xff0c;使…

Redis高可用:哨兵机制(Redis Sentinel)详解

目录 1.什么是哨兵机制&#xff08;Redis Sentinel&#xff09; 2.哨兵机制基本流程 3.哨兵获取主从服务器信息 4.多个哨兵进行通信 5.主观下线和客观下线 6.哨兵集群的选举 7.新主库的选出 8.故障的转移 9.基于pub/sub机制的客户端事件通知 1.什么是哨兵机制&#xf…

重生之我要学C++第六天(const,static,友元)

这篇文章的主要内容是const以及权限问题、static关键字、友元函数和友元类&#xff0c;希望对大家有所帮助&#xff0c;点赞收藏评论支持一下吧&#xff01; 更多优质内容跳转&#xff1a; 专栏&#xff1a;重生之C启程(文章平均质量分93) 目录 const以及权限问题 1.const修饰…