python实现最小二叉堆---最小堆结构

#来源于MOOC学习以及数据结构与算法分析#

在我们学习最小二叉堆代码实现之前,我们需要去了解一下,什么是最小二叉堆(也有最大二叉堆,也叫最大堆)。

也就是说什么是二叉堆???? 

对于这个问题,我们得先知道“优先队列和二叉堆”它们之间的关系。

队列中有一种变体,我们称之为“优先队列”。

根据优先级来决定:优先级最高的在最前面,优先级最低的在最后面。

二叉堆Binary Heap便是用来实现优先队列的数据结构。(二叉堆能够将优先队列的入队和出队的复杂度都保持在O(log n)。

逻辑结构上是为二叉树,但是实际实现是“非嵌套的列表”。

与我们之前说提到过的字典,hash Table ,散列都为ADT 数据结构。

所以它们的方法大多都类似。

那么,我们开始一步步的最小二叉堆的代码实现吧。

一.二叉堆的初始化

采用一个列表来保持堆数据。表首下标为0的项无用,为了后面代码可以用到简单的整数乘除法,保留它。

#二叉堆的初始化
class BinHeap:def __init__(self):self.heaplist = [0]self.currentSize = 0
"""
二叉堆,也就是我们使用非嵌套的列表,
它的首项一定要是0,占住首位"""

当父节点的下标为K时,那么它的左子节点为2K,而它的右子节点为2K+1.

那么,我们知道一个子节点的下标为N时,它的父节点的位置为(N // 2).

这些操作的实现就是建立在---self.heaplist = [0]

二.二叉堆操作实现:Insert代码

insert(key)方法直接加入到列表末尾,无法保持“堆”次序,虽然对其他路径的次序没有影响,但对于其到根的路径可能破坏次序。

所以我们还需要上浮操作---perup方法

那么我们先来创建辅助方法---perup方法

#perup(上浮)方法
def perUp(self,i):while i // 2 > 0:if self.heaplist[i] < self.heaplist[i//2]:self.heaplist[i],self.heaplist[i//2] = \self.heaplist[i//2],self.heaplist[i]i = i // 2
"""
将当前节点与其父节点进行比较,若当前节点小于其父节点
则,当前节点与父节点进行位置交换,进行下一轮的循环。因为我们创建的是最小堆结构,所以节点越往上,其越小。"""

insert插入操作

#insert方法操作
def insert(self,k):self.heaplist.append(k)#添加到某尾self.currentSize = self.currentSize + 1self.perUp(self.currentSize)#进行上浮操作

我们学会了插入节点,那么相同的删除节点,也是轻而易举。

三.二叉堆的delMin()方法实现

delMIn()方法---移走整个堆中最小的key:根节点heaplist[1]

为了保持“完全二叉树”的性质,只用最后一个节点来替代节点。

在这里,我们需要两个辅助方法---percDown 和 minChild

那么,我们先从这两个开始吧。

#percDown 和 minChild 方法
def percDown(self,i):while (i * 2) <= self.currentSizemc = self.minChild(i)if self.heaplist[i] > self.heaplist[mc]:self.heaplist[i],self.heaplist[mc] = \self.heaplist[mc],self.heaplist[i]i = mc
#当节点大于其子节点的时候,两者进行交换,那么它就下沉
#下沉的是我们从末尾移动的节点def minChild(self,i):if i * 2 + 1 > self.currentSize:return i * 2  #唯一子节点else:if self.heaplist[i*2] < self.heaplist[i*2+1]:return i * 2 #选出最小的进行返回else:return i * 2 + 1
#返回最小的那个,来维持完全二叉树结构,最小根结构

随后就是进行delMIn()操作

#delMin()方法---删除最小值
def delMin(self):retval = self.heaplist[1] #移走顶项self.currentSize = self.currentSzie - 1self.heaplist.pop() #删除尾项self.percDown(1)return retval #返回最小值
#因为是最小堆结构,首项一定是最小值

三.bulidHeap(lst) : 从无序表生成“堆”。

叶子节点无序下沉

我们用最后节点的父节点开始,因为叶节点无需下沉。

def buildHeap(self,alist):i = len(alist) // 2self.currentSize = len(alist)self.heaplist = [0] + alist[:]while (i > 0):self.percDown(i)i = i - 1

二叉堆的自排序也可以进行排序:堆排序

我会在后续更新出相应的堆排序。

感谢各位的观看,若有任何疑问,欢迎在下面留言

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

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

相关文章

HiveSql语法优化三 :join优化

前面提到过&#xff1a;Hive拥有多种join算法&#xff0c;包括Common Join&#xff0c;Map Join&#xff0c;Bucket Map Join&#xff0c;Sort Merge Buckt Map Join等&#xff1b;每种join算法都有对应的优化方案。 Map Join 在优化阶段&#xff0c;如果能将Common Join优化为…

Linux 中的网站服务管理

目录 1.安装服务 2.启动服务 3.停止服务 4.重启服务 5.开机自启 6.案例 1.安装服务 网址服务程序 yum insatll httpd -y 查看所有服务 systemctl list-unit-files 2.启动服务 systemctl start httpd 查看服务进程&#xff0c;确认是否启动 ps -ef|grep httpd 3.停止…

python分析数据出现Text input context does not respond to _valueForTIProperty错误

一开始运行脚本还是不报错的&#xff0c;脚本内容部分如下&#xff1a; 出现了如下的效果图&#xff1a; 后面隔了几天再次运行居然报错了&#xff0c;如下图所示&#xff0c;但是也没有更改代码啊。后来发现原来是输入法导致的&#xff0c;把输入法切换成英文状态就不报错啦。…

linux下sys目录与proc目录的作用

sys目录作用 在Linux系统中&#xff0c;/sys目录是一个特殊的虚拟文件系统&#xff08;sysfs&#xff09;&#xff0c;用于提供对内核和设备的运行时信息的访问。它是在内核中运行的驱动程序和子系统的接口&#xff0c;可以用于获取和配置系统的硬件和内核信息。 以下是/sys目…

条件分布律

设是二维离散型随机变量&#xff0c;对于固定的&#xff0c;若&#xff0c;则称 &#xff0c; 其中 为在条件下随机变量的条件分布律。 对于固定的&#xff0c;若&#xff0c;则称 &#xff0c; 其中 为在条件下随机变量的条件分布律。

内网穿透工具,如何保障安全远程访问?

内网穿透工具是一种常见的技术手段&#xff0c;用于在没有公网IP的情况下将本地局域网服务映射至外网。这种工具的使用极大地方便了开发人员和网络管理员&#xff0c;使得他们能够快速建立起本地服务与外部网络之间的通信渠道。然而&#xff0c;在享受高效快捷的同时&#xff0…

C语言之函数设计(1)

目录 没有返回值的函数 通用性 不含形参的函数 函数返回值的初始化 作用域 文件作用域 声明和定义 函数原型声明 头文件和文件包含指令 在上节中我们简单的学习了函数的创建方法&#xff08;函数定义&#xff09;与函数的使用方法&#xff08;函数调用&#xff09;&…

现代雷达车载应用——第2章 汽车雷达系统原理 2.2节 汽车雷达架构

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.2 汽车雷达架构 从顶层来看&#xff0c;基本的汽车雷达由发射器&#xff0c;接收器和天线组成。图2.2给出了一种简化的单通道连续波雷达结构[2]。这…

Doris集群搭建——2.0.1.1版本

目录 一、启动Doris 二、配置并分发doris安装包和环境变量 1.分发doris安装包 2.解压安装包 3.分发环境变量 4.修改对应的配置文件 (1)修改be的配置 (2)修改fe的配置 三、be的扩容与缩容 (一)be扩容 1.添加be节点 3.另外两个节点启动be 4.重新查看be节点状态 (二…

数据可视化?这些平台能处

图表在各行各业都起到举重若轻的作用&#xff0c;无论是项目汇报、业绩分析&#xff0c;亦或是数据挖掘、统计分析&#xff0c;良好的可视化可以为我们的阐述起到画龙点睛的效果。在一篇文章中&#xff0c;如果只有密密麻麻的文字堆积&#xff0c;无论是谁恐怕都无法长期保持注…

如何预防最新的.locked、.locked1勒索病毒感染您的计算机?

尊敬的读者&#xff1a; 近期&#xff0c;网络安全领域迎来一股新潮——.locked、.locked1勒索病毒的威胁&#xff0c;其先进的加密技术令人生畏。本文将深入剖析.locked、.locked1勒索病毒的阴谋&#xff0c;提供特色数据恢复策略&#xff0c;并揭示锁定恶劣行径的先锋预防手…

RK3568平台(网络篇)添加网络交换芯片RTL8306M

一.硬件原理图 分析&#xff1a; 该交换芯片支持I2C、SPI、mdio通信&#xff0c;但是看ast1520的uboot代码采用的是mdio去通信phy芯片的&#xff0c;所以暂时也先采用mdio的方式&#xff0c;需要配置相应的引脚才可以配置成mdio通信模式&#xff0c;具体的配置硬件工程师解决。…

使用netcore编写对比excel差异

一、新建项目Vlook项目 using MiniExcelLibs; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data; using System.IO;namespace Vlook {internal class Program{static void Main(string[] args){var dir App…

L1-046:整除光棍

题目描述 这里所谓的“光棍”&#xff0c;并不是指单身汪啦~ 说的是全部由1组成的数字&#xff0c;比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如&#xff0c;111111就可以被13整除。 现在&#xff0c;你的程序要读入一个整数x&#xff0c;这个…

通义千问关于网络模块的专业知识能力正确率测试

闲着无聊&#xff0c;就用问答区的一个问题&#xff0c;去考验了通义千问&#xff0c;结果优点出乎意料。 我们来看一下具体的问题&#xff0c;这里&#xff0c;我准备了三个问题&#xff1a; 第一个问题&#xff1a;11.192.0.x 注意&#xff0c;这里我并没有增加任何的辅助提…

关于文件操作---C语言

引言 关于文件&#xff0c;想必大家或多或少都会有些了解&#xff0c;文件可以帮我们储存数据&#xff0c;不同格式的文件可以储存不同类型的数据&#xff0c;也可以将文件中的数据用不同的方式打开。电脑中的文件&#xff0c;是放在硬盘上的。在我们编写代码并运行的时候&…

金蝶云星空表单插件获取复选框的值

文章目录 金蝶云星空表单插件获取复选框的值 金蝶云星空表单插件获取复选框的值 object getPur this.View.Model.GetValue("F_XHWT_IsPur", rowIndexV);bool isSerial !Convert.ToBoolean(itemClose["F_XHWT_IsPur"] "");取得值可以直接转换成…

Datawhale聪明办法学Python(task3变量与函数)

一、课程基本结构 课程开源地址&#xff1a;课程简介 - 聪明办法学 Python 第二版 章节结构&#xff1a; Chapter 0 安装 Installation Chapter 1 启航 Getting Started Chapter 2 数据类型和操作 Data Types and Operators Chapter 3 变量与函数 Variables and Functions Ch…

Cortex-M4内核结构

Cortex-M4内核结构 1. 内核Core 2. 三阶流水线 3. 内核工作模式 4. 总结 Cortex-M4内核结构 Cortex-M4处理器是ARMv7-M架构的一种实现&#xff0c;它是一种32位精简指令集(Reduced Instruction Set Computing, RISC)的处理器&#xff0c;有一个三阶的指令流水线&#xff0c;依…

飞天使-docker知识点4-harbor

文章目录 Harbor安装完成harbor 官方建议方式之后查看 images配置docker 使用harbor 仓库上传下载镜像docker 镜像结合harbor 运行 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器&#xff0c;由 vmware 开源&#xff0c;其通过添加一些企业必需的功…