当前位置: 首页 > news >正文

算法通关村第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}}

相关文章:

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

1.Hash基础 (1)基础 哈希也称为散列,通过算法变成固定长度的输出值,存入对应的位置 例如这个算法为取模算法,indexnumber 模 7 存入1到15 (2)碰撞处理 当多个元素映射到同一位置上时就产生…...

C++:函数

函数参数的传递机制 C的每个程序至少有一个函数&#xff0c;即主函数main()&#xff0c;函数也是类的方法的实现手段。C的函数包括两类&#xff1a;预定于函数和用户自定义函数。 函数的定义格式为&#xff1a; <返回值类型><函数名>(<参数列表>) <函…...

Linux网络编程:libevent事件通知库

文章目录&#xff1a; 一&#xff1a;libevent库 二&#xff1a;libevent框架 1.常规事件event 1.1 创建事件event&#xff08;event_new&#xff09; 1.2 添加事件到 event_base&#xff08;event_add&#xff09; 1.3 从event_base上摘下事件&#xff08;event_del&a…...

java.lang.reflect.InvocationTargetException:null报未知异常

在项目上线过程中&#xff0c;突然出现大量异常信息&#xff0c;堆栈信息如下&#xff1a; java.lang.reflect.InvocationTargetException: null at jdk .internal.reflect.GeneratedMethodAccessor792 .invoke(Unknown Source) ~[?:?] at jdk.internal.reflect.DelegatingM…...

MySQL高级篇——MySQL架构篇1(Linux下MySQL8的安装与使用)

目录 0 安装前0.1 Linux系统及工具的准备0.2 查看是否安装过MySQL0.3 MySQL的卸载 1 MySQL8的Linux版安装1.1 MySQL的4大版本1.2 下载MySQL指定版本1.3 CentOS7下检查MySQL依赖1.4 CentOS7下MySQL安装过程 2 MySQL登录2.1 首次登录2.2 修改密码2.3 设置远程登录 3 MySQL 8 的密…...

解决 go mod tidy 加载模块超时

如果go mod tidy 加载模块超时 解决方法 修改GOPROXY: 查看go环境相关信息&#xff1a; go envgo env -w GOPROXYhttps://goproxy.cn...

金融市场中的机器学习;快手推出自研语言模型“快意”

&#x1f989; AI新闻 &#x1f680; OpenAI可能面临《纽约时报》的起诉&#xff0c;侵犯知识产权引发争议 摘要&#xff1a;OpenAI使用《纽约时报》的文章和图片来训练AI模型&#xff0c;违反了《纽约时报》的服务条款&#xff0c;可能面临巨大损失。此前&#xff0c;也有其…...

【面试刷题】——什么是深拷贝和浅拷贝?

深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是在编程中用来描述对象拷贝的两个概念&#xff0c;特别是在涉及对象包含其他对象&#xff08;如嵌套数据结构、指针等&#xff09;的情况下。 浅拷贝&#xff08;Shallow Copy&#xff…...

物联网(IoT)安全挑战与解决方案: 分析物联网设备面临的安全威胁,以及如何设计和管理安全的IoT生态系统

第一章&#xff1a;引言 随着科技的飞速发展&#xff0c;物联网&#xff08;IoT&#xff09;作为连接世界的桥梁&#xff0c;已经成为现代社会不可或缺的一部分。然而&#xff0c;随着IoT设备数量的不断增加&#xff0c;其安全问题也日益显著。本文将深入探讨IoT领域面临的安全…...

Ubuntu 22.04.3 LTS 维护更新发布

近日消息&#xff0c;Canonical 今天发布了代号为 Jammy Jellyfish、长期支持的 Ubuntu 22.04 第 3 个维护版本更新&#xff0c;距离上个版本相隔 6 周时间。 Ubuntu 22.04.3 LTS 最大的亮点在于内核升级到 Linux Kernel 6.2&#xff0c;此外 Mesa 图形堆栈也升级到 23.0.4 版…...

平安健康,找到了医疗服务的价值密码

健康是人类的永恒需求&#xff0c;围绕医疗和健康服务衍生的产业&#xff0c;却苦于无法和用户建立足够紧密、长期的联系。由此&#xff0c;也不得不面临价值从何而来的问题。 作为医疗服务领域的代表性企业&#xff0c;平安健康医疗科技有限公司&#xff08;股票简称“平安好…...

❤ vue 使用原生组件

❤ vue 使用原生组件 1、做一个input输入框验证开始 ① 想让我们的input输入框类型为时间&#xff0c;只需要为我们的输入框简单的加一个类型的type即可 <input type"date" id"birthday" name"birthday" placeholder"年/月/日"&…...

4.12 TCP 连接,一端断电和进程崩溃有什么区别?

目录 TCP keepalive TCP 的保活机制 主机崩溃 进程崩溃 有数据传输的场景 客户端主机宕机&#xff0c;又迅速重启 客户端主机宕机&#xff0c;一直没有重启 TCP连接服务器宕机和进程退出情况总结 TCP keepalive TCP 的保活机制 TCP 保活机制需要通过 socket 接口设置 S…...

十二、pikachu之URL重定向

文章目录 1、URL重定向概述2、实战3、URL跳转的几种方式:3.1 META标签内跳转3.2 javascript跳转3.3 header头跳转 1、URL重定向概述 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的&#xff08;可能是用户传参&#xff0c;或者之前预埋…...

贝叶斯公式中的动词 命名技巧

一项血液化验有95%的把我诊断某种疾病&#xff0c;但是&#xff0c;这项化验用于健康人也会有1%的“伪阳性”结果(即如果一个健康人接受这项化验&#xff0c;则化验结果乌镇此人患有该疾病的概率是0.01)。如果该疾病的患者事实上只占总人口的0.5%&#xff0c;若某人化验结果为阳…...

ctfshow-web13 文件上传

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先看到是一个上传页面&#xff0c;测试其他无果&#xff0c;遂进行目录遍历&#xff0c;发现upload.php.bak文件 可以看到这里的限制条件&#xff0c;大小&#xff0c;以及内容&#xff0c;这里可以使用.use…...

Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统&#xff0c;该系统可以帮助教师快速录入学生的信息&#xff0c;并且对学生的信息进行基本的增、删、改、查操作&#xff1b;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…...

2023-08-25力扣每日一题

链接&#xff1a; 1448. 统计二叉树中好节点的数目 题意&#xff1a; 判断根节点到每个节点X的过程中&#xff0c;如果没有值大于X&#xff0c;则该节点为好节点&#xff0c;求好节点数量 解&#xff1a; 由于求根节点到其他节点的路径&#xff0c;则使用dfs算法&#xff…...

Vue3中的计算属性和属性监听

compute计算属性 Vue3中可以通过 compute进行监听计算属性&#xff0c;他返回的是一个ref的对象&#xff0c;也就是说 通过compuye这种方式计算属性实际上是进行了ref的操作 import { computed } from vue const user reactive({firstName: A,lastName: B }) // 只有getter的…...

微信开发之一键修改群公告的技术实现

简要描述&#xff1a; 设置群公告 请求URL&#xff1a; http://域名地址/setChatRoomAnnouncement 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...