算法基础学习笔记——⑧堆\哈希表

博主:命运之光
专栏:算法基础学习

在这里插入图片描述

目录

✨堆

🍓堆模板:

✨哈希表

🍓一般哈希模板:

🍓字符串哈希模板:


前言:算法学习笔记记录日常分享,需要的看哈O(∩_∩)O,感谢大家的支持!


 ✨堆

如何手写一个堆?

1.插入一个数 heap[++size]=x;up(size);

2.求集合当中的最小值 heap[1]

3.删除最小值//用最后一个元素覆盖掉第一个元素heap[1]=heap[size];size--;down(1);

4.删除任意一个元素 heap[k]=heap[size];size--;down(k);up(k);

5.修改任意一个元素 heap[k]=x;down(k);up(k);

堆的基本结构:完全二叉树//除最后一层节点之外,上面所有结点都是满的,最后一层结点从左到右排列

堆的存储:用一维数组存

堆可以使用一维数组来进行存储。一维数组可以使用连续的内存空间来表示堆的结构。

堆是一种完全二叉树,可以按照从上到下、从左到右的顺序将其节点依次存储在一维数组中。对于一个具有 n 个节点的堆,可以使用一个长度为 n 的一维数组来存储。

假设堆的根节点存储在数组的索引为 0 的位置。对于任意一个节点 i,其左子节点的索引为 2i+1,右子节点的索引为 2i+2。同时,对于一个节点 i 的父节点,其索引为 (i-1)/2。

这种数组表示的好处是可以通过索引计算节点之间的关系,不需要使用指针或引用。

以下是一个示例,展示如何使用一维数组存储堆:

class Heap:
    def __init__(self):
        self.heap = []

    def parent(self, i):
        return (i - 1) // 2

    def left_child(self, i):
        return 2 * i + 1

    def right_child(self, i):
        return 2 * i + 2

    def insert(self, item):
        self.heap.append(item)
        self.heapify_up(len(self.heap) - 1)

    def heapify_up(self, i):
        while i != 0 and self.heap[i] < self.heap[self.parent(i)]:
            self.heap[i], self.heap[self.parent(i)] = self.heap[self.parent(i)], self.heap[i]
            i = self.parent(i)

    def extract_min(self):
        if len(self.heap) == 0:
            return None

        root = self.heap[0]
        self.heap[0] = self.heap[-1]
        self.heap.pop()
        self.heapify_down(0)

        return root

    def heapify_down(self, i):
        while (left := self.left_child(i)) < len(self.heap):
            smallest = left
            right = self.right_child(i)
            if right < len(self.heap) and self.heap[right] < self.heap[left]:
                smallest = right

            if self.heap[i] <= self.heap[smallest]:
                break

            self.heap[i], self.heap[smallest] = self.heap[smallest], self.heap[i]
            i = smallest

上述示例代码展示了一个最小堆的实现。堆的插入操作使用了堆化上移(`heapify_up`),从插入位置开始,将节点与其父节点进行比较并交换,直到满足堆的性质为止。堆的删除操作使用了堆化下移(`heapify_down`),从根节点开始,将节点与其较小的子节点进行比较并交换,直到满足堆的性质为止。

通过使用一维数组存储堆,可以方便地实现堆的各种操作,并且可以节省存储空间,提高访问效率。

堆的基本操作:

堆是一种常用的数据结构,它具有以下基本操作:

  1. 插入(Insertion):将一个新元素插入到堆中。插入操作通常用于将新元素添加到堆的末尾,并通过一系列交换操作将其移动到合适的位置,以保持堆的性质。对于最小堆,插入操作会将新元素插入到堆中并保持最小堆的性质;对于最大堆,则是保持最大堆的性质。

  2. 删除(Deletion):从堆中删除指定元素或者删除堆顶的元素。删除操作通常用于删除堆中的某个元素,并保持堆的性质不变。对于最小堆,删除操作通常删除堆顶的最小元素,并通过将堆的最后一个元素移动到堆顶,并通过一系列交换操作将其移动到合适的位置,以保持最小堆的性质。最大堆的删除操作也是类似的,只是操作的目标变成了删除堆顶的最大元素。

  3. 获取堆顶元素(Get Top):获取堆中的最小或最大元素,即堆顶的元素,而不进行删除操作。对于最小堆,获取堆顶元素即为获取堆中的最小元素;对于最大堆,则是获取堆中的最大元素。获取堆顶元素的时间复杂度为 O(1)。

🍓堆模板:

// h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1
// ph[k]存储第k个插入的点在堆中的位置
// hp[k]存储堆中下标是k的点是第几个插入的
int h[N], ph[N], hp[N], size;
// 交换两个点,及其映射关系
void heap_swap(int a, int b)
{
     swap(ph[hp[a]],ph[hp[b]]);//
     swap(hp[a], hp[b]);//交换所记录的在堆中插入的值的顺序
     swap(h[a], h[b]);//交换堆中的值
}
void down(int u)
{
     int t = u;
     if (u * 2 <= size && h[u * 2] < h[t]) t = u * 2;
     if (u * 2 + 1 <= size && h[u * 2 + 1] < h[t]) t = u * 2 + 1;
     if (u != t)
     {
         heap_swap(u, t);
         down(t);
     }
}
void up(int u)
{
     while (u / 2 && h[u] < h[u / 2])
     {
         heap_swap(u, u / 2);
         u >>= 1;
     }
}
// O(n)建堆
for (int i = n / 2; i; i -- ) down(i);

✨哈希表

一般哈希

使用情况:将大范围数映射成小范围//哈希是把所有的数放在小空间存起来,然后解决冲突,离散化是把用到的抽取出来

🍓一般哈希模板:

(1) 拉链法

int h[N], e[N], ne[N], idx;
 // 向哈希表中插入一个数
 void insert(int x)
 {
     int k = (x % N + N) % N;
     e[idx] = x;
     ne[idx] = h[k];
     h[k] = idx ++ ;
 }
 // 在哈希表中查询某个数是否存在
 bool find(int x)
 {
     int k = (x % N + N) % N;
     for (int i = h[k]; i != -1; i = ne[i])
         if (e[i] == x)
             return true;
     return false;
 }

(2) 开放寻址法

int h[N];
 // 如果x在哈希表中,返回x的下标;如果x不在哈希表中,返回x应该插入的位置
 int find(int x)
 {
     int t = (x % N + N) % N;
     while (h[t] != null && h[t] != x)
     {
         t ++ ;
         if (t == N) t = 0;
     }
     return t;
 }

字符串哈希

字符串前缀哈希法//快速判断两个字符串是否相等

🍓字符串哈希模板:

🍒🍒核心思想:将字符串看成P进制数,P的经验值是131或13331,取这两个值的冲突概率低

🍒🍒小技巧:取模的数用2^64,这样直接用unsigned long long存储,溢出的结果就是取模的结果

typedef unsigned long long ULL;
ULL h[N], p[N]; // h[k]存储字符串前k个字母的哈希值, p[k]存储 P^k mod 2^64
// 初始化
p[0] = 1;
for (int i = 1; i <= n; i ++ )
{
     h[i] = h[i - 1] * P + str[i];
     p[i] = p[i - 1] * P;
}
// 计算子串 str[l ~ r] 的哈希值
ULL get(int l, int r)
{
     return h[r] - h[l - 1] * p[r - l + 1];
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt文件系统源码分析—第六篇QSaveFile

深度 本文主要分析Windows平台&#xff0c;Mac、Linux暂不涉及 本文只分析到Win32 API/Windows Com组件/STL库函数层次&#xff0c;再下层代码不做探究 本文QT版本5.15.2 类关系图 QTemporaryFile继承QFile QFile、QSaveFile继承QFileDevice QFileDevice继承QIODevice Q…

远程访问本地jupyter notebook服务 - 无公网IP端口映射

文章目录 前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 转载自远控源码文章&#xff1a;公网远程访问jupyter notebook【cpolar内网穿透】 前言 Jupyter Notebook&am…

网络原理(六):http 协议(上)

目录 HTTP 协议是什么 抓包工具 Fiddler 的下载 使用Fiddler HTTP 请求 (Request) HTTP 请求格式 首行 请求头&#xff08;Header&#xff09; Cookie HTTP 协议是什么 还是老样子&#xff0c;在讲解http 之前我们先来了解以下什么叫做 http 。 HTTP&#xff08;Hyp…

(转载)从0开始学matlab(第14天)—while循环结构

循环(loop) 是一种 matlab 结构&#xff0c;它允许我们多次执行一系列的语句。循环结构有两种基本形式 :while 循环和 for 循环。两者之间的最大不同在于代码的重复是如何控制的。在while 循环中&#xff0c;代码的重复的次数是不能确定的&#xff0c;只要满足用户定义的条件…

整理6个超好用的在线编辑器!

随着 Web 开发对图像可扩展性、响应性、交互性和可编程性的需求增加&#xff0c;SVG 图形成为最适合 Web 开发的图像格式之一。它因文件小、可压缩性强并且无论如何放大或缩小&#xff0c;图像都不会失真而受到欢迎。然而&#xff0c;为了编辑 SVG 图像&#xff0c;需要使用 SV…

《五》 Git 中的标签和分支

标签 tag&#xff1a; Git 可以给仓库中某一次 commit 的提交打上标签。对于重大的版本经常会打上一个标签来表示它的重要性。 创建标签&#xff1a; git tag【tag 名称】&#xff1a;创建标签。 查看标签&#xff1a; git tag&#xff1a;查看标签。 推送标签到远程仓库…

任务40 评奖系统设计

系列文章 任务40 评奖系统设计 为教务处设计一个学生评价老师的程序&#xff1a; 每位学生投一张票&#xff0c;选出自己最喜爱的老师&#xff0c;选票格式为&#xff1a; | 第一喜爱的老师 | 第二喜爱的老师 |第三喜爱的老师 | | 工号 |工号 |工号 | 上述数据存放在一个数据…

随机网络构建

随机网络构建 文章目录 随机网络构建[toc]1 随机网络定义2 网络拓扑性质2.1 边数分布2.2 度分布 3 代码实现 1 随机网络定义 随机网络与规则网络相对应&#xff0c;最为经典的随机网络模型是Erds和Rnyi研究的ER随机图模型&#xff0c;ER随机图模型有两种定义方式&#xff1a; …

三种快速转换PDF为TXT的方法:简单、高效、免费

如何将PDF转换为TXT文件&#xff1f;在日常生活中&#xff0c;PDF和TXT是常见的文本格式。PDF格式文件具有稳定的布局和易于存储的特点。然而&#xff0c;许多在线下载的电子书通常是以PDF格式提供的&#xff0c;而电子阅读器通常不支持PDF格式&#xff0c;这就导致了无法方便地…

字节软测划水四年,内容过于真实......

先简单交代一下吧&#xff0c;潇潇是某不知名211的本硕&#xff0c;18年毕业加入一个小厂&#xff0c;之后跳槽到了字节跳动&#xff0c;一直从事测试开发相关的工作。之前没有实习经历&#xff0c;算是四年半的工作经验吧。 这四年半之间他完成了一次晋升&#xff0c;换了一家…

SAP-MM-计算方案字段解析

01、 “步骤”&#xff1a;标识此条件类型在计算方案中的顺序编号&#xff0c;此编号会影响到后续业务中条件类型的排序&#xff0c;不同条件类型之间的编号最好间隔大一些&#xff0c;这样设置便于以后对计算方案进行扩展&#xff1b; 02、 “计数器”&#xff1…

Apache Kafka - 重识消费者

文章目录 概述Kafka消费者的工作原理Kafka消费者的配置Kafka消费者的实现高级API低级API 导图总结 概述 Kafka是一个分布式的消息队列系统&#xff0c;它的出现解决了传统消息队列系统的吞吐量瓶颈问题。 Kafka的高吞吐量、低延迟和可扩展性使得它成为了很多公司的首选消息队…

面试前15天刷完这个笔记,拿下字节测开岗offer....

面试&#xff0c;跳槽&#xff0c;每天都在发生&#xff0c;跳槽&#xff0c;更是很常见的&#xff0c;对于每个人来说&#xff0c;跳槽的意义也各不相同&#xff0c;可能是一个人更向往一个更大的平台&#xff0c;更好的地方&#xff0c;可以通过换一个环境改变自己的现状。而…

解密Java Class文件不为人知的秘密

Java 诞生多年&#xff0c;因此在网络上&#xff0c;有关 Java Class 文件格式解析的文章有很多&#xff0c;但他们大多数都是在列举《Java 虚拟机》中定义的格式&#xff0c;通读下来&#xff0c;好像所有的东西都讲清楚了&#xff0c;但是我个人好像并没有看懂&#xff0c;不…

2. css表格属性、文本属性、列表属性、边距属性、尺寸属性

1. 表格属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width…

【JavaSE】Java基础语法(十五):继承

文章目录 1. 继承的实现2. 继承的好处和弊端3. Java中继承的特点4. 继承中的成员访问特点5. super6. 继承中构造方法的访问特点7. 继承中成员方法的访问特点8. super内存图9. 方法重写10. 权限修饰符 1. 继承的实现 继承的概念 继承是面向对象三大特征之一&#xff0c;可以使得…

【状态估计】基于随机方法优化PMU优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

路径规划算法:基于猫群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于猫群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于猫群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法猫群…

基于docker部署testlink并集成mantis

使用docker pull命令拉取需要的镜像。由于testlink和mantis都需要存储相关数据&#xff0c;所以这里可以看到还拉取了一个mysql镜像。 # docker pull bitnami/testlink:1.9.16-r8 # docker pull vimagick/mantisbt # docker pull mysql:5.7.20 使用docker network命令中创建…

Altium Designer 相同电路多组复制布线

在进行设计开发的时候&#xff0c;总会遇到相同的电路&#xff0c;或者模块&#xff0c;这些电路可以使用相同的布局和走线。我们可以画好其中一部分&#xff0c;然后直接复制&#xff0c;就可以提高效率。下面记录我自己的实际操作过程&#xff0c;有一些地方遇到了问题&#…
最新文章