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

news2024/11/14 4:00:32

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 30
        System.out.println("Dequeued element: " + queue.pop()); // Output: 10
        System.out.println("Queue size: " + queue.size()); // Output: 2
        queue.push(40);
        queue.push(50);
        System.out.println("Queue elements:");
        queue.traverse(); // Output: 20 30 40 50
        System.out.println("Queue size: " + queue.size()); // Output: 4
    }


}

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

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

相关文章

L Grayscale Confusion【2023牛客多校第10场】【拓扑排序】

来源:“范式杯”2023牛客暑期多校训练营10 —— L Grayscale Confusion 题意:给定 n 个三元组 ( r i , g i , b i ) 。构造一个长度为 n 的数组 w, 使得 ①w1 w 2 ②对于任意 i, j ,若 r i > r j , g i > g …

python之Numpy

ndarray数组对象 NumPy定义了一个n维数组对象,简称ndarray对象,它是一个一系列相同类型元素组成的数组集合。数组中的每个元素都占有大小相同的内存块 ndarray 对象采用了数组的索引机制,将数组中的每个元素映射到内存块上,并且按…

C++笔记之虚函数重写规则、返回类型协变、函数的隐藏

C笔记之虚函数重写规则、返回类型协变、函数的隐藏 code review! 文章目录 C笔记之虚函数重写规则、返回类型协变、函数的隐藏1.返回类型协变2.C中函数的隐藏 —— C Primer Plus (第6版) —— cppreference 1.返回类型协变 2.C中函数的隐藏 在C中&a…

深入理解AQS和ReentrantLock

AQS 之前介绍synchronized关键字时提到过管程的概念,synchronized就是JVM内置管程,其使用的是管程的MESA模型。但是synchronized有一些缺点: 非公平锁,可能会使得一些线程长久抢占不到锁,导致其处于饥饿状态&#xf…

5.分布式事务管理-Seata

由于Transactional注解只能控制所在服务器A的事务,当方法中调用其他服务器B的方法,当A中该方法出错时,Transactional只能回滚A中该方法中的SQL,而A调用B的方法中的SQL无法回滚 1.Seata Seata(分布式事务解决方案&…

Electron入门,项目运行,只需四步轻松搞定。

electron 简单介绍: 实现:HTML/CSS/JS桌面程序,搭建跨平台桌面应用。 electron 官方文档: [https://electronjs.org/docs] 本文是基于以下2篇文章且自行实践过的,可行性真实有效。 文章1: https://www.cnbl…

Centos开启防火墙和端口命令

Centos开启防火墙和端口命令 1. 开启查看关闭firewalld服务状态2. 查看端口是否开放3. 新增开放端口4. 查看开放的端口 1. 开启查看关闭firewalld服务状态 #启动/关闭firewall systemctl start/stop firewalld #查看防火墙状态 systemctl status firewalld #禁用或者启用 syst…

sql in mac学习记录

鉴于有一段时间没有访问mysql了,最近打算在mac 系统上下载mysql 练习一下sql的使用,于是 First, the mysql download https://dev.mysql.com/downloads/mysql/ Second, Mysql install steps Install the software by normally install one software …

mysql 、sql server trigger 触发器

sql server mySQL create trigger 触发器名称 { before | after } [ insert | update | delete ] on 表名 for each row 触发器执行的语句块## 表名: 表示触发器监控的对象 ## before | after : 表示触发的时间,before : 表示在事件之前触发&am…

cloud_mall-notes02

1、多条件分页查询page ApiOperation("多条件分页查询xxxx")GetMapping("page")PreAuthorize("hasAuthority(模块权限:权限:page)")public ResponseEntity<Page<实体类>> loadxxxxPage(Page<实体类> page,实体类 domain) {pag…

磁盘满了解决办法

磁盘满了解决办法 1.添加硬盘2.查看是否添加成功3.创建分区4.查看卷名5.扩容6.7.8. 1.添加硬盘 2.查看是否添加成功 lsblk注&#xff1a;若没有&#xff0c;需要partprobe刷新或者重启 3.创建分区 fdisk /dev/sdb4.查看卷名 vgdisplay5.扩容 vgextend centos /dev/sdb16. …

Docker安装MySQL、Redis如何自启?

1、问题&#xff1a; Docker自启&#xff1a;http://t.csdn.cn/L2v55 重新启动虚拟机&#xff0c;Docker自动启动之后&#xff0c;发现MySQL、Redis都没有启动。 docker ps 没查到有启动的容器。 docker ps -a 查看所有的容器。 2、先使用 su root 命令&#xff0c;切换到root…

朴实无华的数据增强然后训练一下应用在电网异物检测领域,好像有自己的数据集就能发文了

RCNN-based foreign object detection for securing power transmission lines (RCNN4SPTL) Abstract 本文提出了一种新的深度学习网络——RCNN4SPTL (RCNN -based Foreign Object Detection for Securing Power Transmission lines)&#xff0c;该网络适用于检测输电线路上的…

一个炫酷的头像悬停效果 2

基于上次翻译的 &#x1f525;&#x1f525;一个炫酷的头像悬停效果 收获了不少同学的喜欢&#xff0c;原作者近期进行了优化升级。本文将升级后的核心实现过程进行梳理讲解&#xff0c;如果没看过第一期的推荐先看看第一期的实现过程。升级后的效果如下图所示。 gif动画效果如…

0008Java程序设计-JSP学生成绩管理系统设计与实现

摘 要目录系统实现开发环境 摘 要 随着网络的不断发展&#xff0c;一个好的成绩查询系统&#xff0c;不仅便于学生查询成绩、查询个人信息&#xff0c;而且有利于管理员对学生成绩的统一管理&#xff0c;考试之后学生能及时的对个人信息进行查看&#xff0c;减少了老师和学生之…

高性能MySQL实战(一):表结构 | 京东物流技术团队

最近因需求改动新增了一些数据库表&#xff0c;但是在定义表结构时&#xff0c;具体列属性的选择有些不知其所以然&#xff0c;索引的添加也有遗漏和不规范的地方&#xff0c;所以我打算为创建一个高性能表的过程以实战的形式写一个专题&#xff0c;以此来学习和巩固这些知识。…

09强化学习

强化学习有关词汇 state:对Environment的完整描述 action: 给定环境中所有有效操作的集合&#xff0c;通常称为动作空间 agent:执行action的模型 Environment:代理之外的所有部分。agent可以直接或间接的与之交互的一切&#xff0c;Agent执行操作时&#xff0c;Environment…

BarCodeWiz ActiveX Control Crack

BarCodeWiz ActiveX Control Crack BarcodeWiz ActiveX Control–只需单击按钮即可将所有基本条形码类型添加到Microsoft Office中。在Microsoft Word中&#xff0c;创建单独的条形码、标签页或合并文档。在Microsoft Excel中&#xff0c;选择单元格范围并自动将每个单元格转换…

css的常见伪元素使用

1.first-line 元素首行设置特殊样式。 效果演示&#xff1a; <div class"top"><p>可以使用 "first-line" 伪元素向文本的首行设置特殊样式。<br> 换行内容 </p></div> .top p::first-line {color: red;} 2.first-lette…

每日一题——判断是不是平衡二叉树

题目 输入一棵节点数为 n 二叉树&#xff0c;判断该二叉树是否是平衡二叉树。 在这里&#xff0c;我们只需要考虑其平衡性&#xff0c;不需要考虑其是不是排序二叉树 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&#xff0c;具有以下性质&#xff1a;它是一棵空树…