python堆-完全二叉树--完全解读

  • 作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者,目前于海外某世界知名高校就读计算机相关专业。
  • 荣誉:阿里云博客专家认证、腾讯开发者社区优质创作者,在CTF省赛校赛多次取得好成绩。
  • 跨领域学习,喜欢摄影、弹吉他、咏春拳。文章深入浅出、语言风趣;爱吃必胜客社区创立者,旨在“发现美 欣赏美

  • 🏆 学习系列专栏
    。🏅 Python学习宝库
    。🏅 网络安全学习宝库

在这里插入图片描述

在这里插入图片描述

文章目录

  • ⭐️堆
  • 为什么使用 heapq?
  • 它是如何工作的?
  • 使用heapq的基本操作
    • 创建堆:
    • 访问最小元素:
    • 移除最小元素:
    • Heapify:
  • 现在some_list是一个堆
    • 效率
    • 应用
      • 1. 堆排序(Heap Sort)
      • 2. 使用堆实现优先队列
      • 3. 查找列表中第k个最小元素
      • 4. 使用堆实现Dijkstra算法(简化版)
    • 您给出的这个结构是一个图的表示方式,
    • `kth_smallest` 使用了 Python 的 `heapq` 模块来找到一个列表中第 k 个最小的元素。这个函数的工作原理如下:

⭐️堆

Python中的堆是通过heapq模块实现的。这个模块提供了一种高效的方式来创建和管理堆数据结构。堆是一种二叉树,其中树完全填充,只有最底层可能从左到右不完全填充。

为什么使用 heapq?

Python的heapq模块使用普通列表实现了最小堆。最小堆确保最小的元素始终在根部(即heap[0])。heapq模块提供了操作堆的函数,同时保持堆属性不变

它是如何工作的?

在底层,heapq利用了二叉堆的属性。二叉堆是一个完全二叉树,满足堆属性。在最小堆中,父节点小于其子节点。这个属性对于每个节点都必须是真的,这使得根部成为堆中最小的元素

使用heapq的基本操作

创建堆:

你从一个空列表开始,然后使用heapq.heappush()添加元素。这个函数添加元素的同时重新排列堆,以保持堆属性。

import heapq

minHeap = []
heapq.heappush(minHeap, 3)
heapq.heappush(minHeap, 1)
heapq.heappush(minHeap, 2)

这些操作之后,minHeap将会是[1, 3, 2]。最小元素(1)在根部

访问最小元素:

最小元素始终可以在minHeap[0]找到。这是一个常数时间操作

移除最小元素:

使用heapq.heappop()移除并返回最小元素。这个操作也会重新排列堆以保持其属性。

smallest_element = heapq.heappop(minHeap)  # 移除并返回 '1'

Heapify:

如果你有一个现有列表,你可以使用heapq.heapify()将其转换为堆。这会重新排列元素以满足堆属性

some_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
heapq.heapify(some_list)

现在some_list是一个堆

效率

堆在不断需要访问最小(或在最大堆的情况下是最大)元素的任务中非常高效插入和删除的时间复杂度为O(log n),访问最小元素的时间复杂度为O(1)。

应用

堆被用在算法中,如堆排序,在优先队列中,用于高效地找到列表中的第k个最小/最大元素,以及在图算法中,如迪杰斯特拉(Dijkstra)最短路径算法

当然可以。我会给出几个Python中使用heapq模块的示例代码,以展示堆的一些常见应用。

1. 堆排序(Heap Sort)

import heapq

def heap_sort(nums):
    heapq.heapify(nums)  # 将列表转换为堆
    return [heapq.heappop(nums) for _ in range(len(nums))]

# 示例
nums = [3, 1, 4, 1, 5, 9, 2, 6, 5]
sorted_nums = heap_sort(nums)
print(sorted_nums)

2. 使用堆实现优先队列

import heapq

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

    def push(self, item, priority):
        heapq.heappush(self.heap, (priority, item))

    def pop(self):
        return heapq.heappop(self.heap)[1]

# 示例
pq = PriorityQueue()
pq.push('任务1', 3)
pq.push('任务2', 1)
pq.push('任务3', 2)

while pq.heap:
    print(pq.pop())

3. 查找列表中第k个最小元素

import heapq

def kth_smallest(nums, k):
    return heapq.nsmallest(k, nums)[-1]

# 示例
nums = [3, 1, 4, 1, 5, 9, 2, 6, 5]
k = 4
print(kth_smallest(nums, k))

4. 使用堆实现Dijkstra算法(简化版)

import heapq

def dijkstra(graph, start):
    # 初始化距离表,所有距离设为无穷大
    distances = {vertex: float('infinity') for vertex in graph}
    distances[start] = 0
    # 创建一个优先队列,并把起始顶点放入队列中
    pq = [(0, start)]
    
    while pq:
        current_distance, current_vertex = heapq.heappop(pq)

        # 跳过处理已经找到更短路径的节点
        if current_distance > distances[current_vertex]:
            continue

        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight

            # 更新距离表
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(pq, (distance, neighbor))
    
    return distances

# 示例图
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}

print(dijkstra(graph, 'A'))

这些示例覆盖了堆的一些基本用法,包括排序、优先队列、查找特定元素和图算法。通过这些示例,可以更好地理解堆的实用性和在算法中的应用。

您给出的这个结构是一个图的表示方式,

具体来说,它是一个带权重的有向图的字典表示形式。在这个字典中,每个键(例如 ‘A’, ‘B’, ‘C’, ‘D’)代表图中的一个顶点,而与每个键相关联的字典则表示从该顶点出发到其他顶点的边及其相应的权重

这种表示方式非常适合用来描述图的结构,特别是当你需要实现图的算法(如路径查找、网络流分析等)时。这里是如何解读这个图:

顶点 ‘A’ 有两条边,一条通向 ‘B’,权重为 1,另一条通向 ‘C’,权重为 4。
顶点 ‘B’ 有三条边,分别通向 ‘A’(权重为 1)、‘C’(权重为 2)和 ‘D’(权重为 5)。
顶点 ‘C’ 有三条边,分别通向 ‘A’(权重为 4)、‘B’(权重为 2)和 ‘D’(权重为 1)。
顶点 ‘D’ 有两条边,一条通向 ‘B’,权重为 5,另一条通向 ‘C’,权重为 1。
这种表示法是图论和网络分析中常用的,尤其是在编程和算法设计时。例如,你可以用这个图来实现Dijkstra算法,寻找从一个顶点到另一个顶点的最短路径

kth_smallest 使用了 Python 的 heapq 模块来找到一个列表中第 k 个最小的元素。这个函数的工作原理如下:

  1. heapq.nsmallest(k, nums):这个函数调用从 nums 列表中找到 k 个最小的元素。内部实现上,它首先将列表转换成一个最小堆,然后一次取出最小元素直到取出 k 个。

  2. [-1]:这部分从由 nsmallest 返回的列表中取出最后一个元素。由于这个列表是有序的,最后一个元素就是这 k 个最小元素中最大的一个,也就是整个列表中第 k 个最小的元素。

这个函数的时间复杂度取决于 heapq.nsmallest 函数的实现,通常情况下这个操作的时间复杂度是 O(n log k),其中 n 是列表 nums 的长度。

这里是一个使用示例:

import heapq

def kth_smallest(nums, k):
    return heapq.nsmallest(k, nums)[-1]

# 示例
nums = [3, 1, 4, 1, 5, 9, 2, 6, 5]
k = 4
print(kth_smallest(nums, k))  # 输出第4个最小的元素

在这个例子中,kth_smallest(nums, k) 会返回列表 nums 中第 4 个最小的元素。
在这里插入图片描述

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

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

相关文章

PHP 读取excel输入为HTML

目录 介绍 安装扩展 读取excel文件 输入为html 保存到文件 总结 介绍 以前都是使用phpexcel&#xff0c;不过已经不再更新了&#xff0c; 不过不用担心还可以使用phpspreadsheet来替代它进行操作。 PHPSpreadsheet-在PHP中读取、创建和编写电子表格文档-电子表格引擎。…

SpringBoot代码混淆与反混淆加密工具详解

目录 反编译 混淆 正文 一共就两步&#xff0c;无需源码&#xff0c;直接对ipa文件进行混淆加密 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 简单就是把代码跑一哈&#xff0c;然后我们的代码 .java文件 就被编译成了 .class 文件 反编译 就是…

高精度地图定位模块技术规范

目 录 1 概述................................................................................................... 5 1.1 适用范围...................................................................................... 5 1.2 规范性引用文件....................…

Multimodal Chain-of-Thought Reasoning in Language Models语言模型中的多模态思维链推理

Abstract 大型语言模型 (LLM) 通过利用思维链 (CoT) 提示生成中间推理链作为推断答案的基本原理&#xff0c;在复杂推理方面表现出了令人印象深刻的性能。然而&#xff0c;现有的 CoT 研究主要集中在语言情态上。我们提出了 Multimodal-CoT&#xff0c;它将语言&#xff08;文本…

MyBatis-Plus(一):根据指定字段更新或插入

根据指定字段更新或插入 1、概述2、实现方式2、总结 1、概述 MyBatis-Plus中提供了一个saveOrUpdate()方法&#xff0c;默认情况下可以根据主键是否存在进行更新或插入操作&#xff0c;但是实际场景中&#xff0c;根据指定字段进行更新或插入的情况也非常多见&#xff0c;今天…

MySQL——表的增删查改

目录 一.Create&#xff08;创建&#xff09; 1.单行数据 全列插入 2.多行数据 指定列插入 3.插入否则更新 4. 替换 二.Retrieve&#xff08;读取&#xff09; 1. select 列 查询 2.where 条件 3.结果排序 4.筛选分页结果 三.Update &#xff08;修改&#xff09;…

DDR4 设计概述以及分析仿真案例(硬件学习)

引言&#xff1a;随着计算机&#xff0c;服务器的性能需求越来越高&#xff0c;DDR4开始应用在一些高端设计中&#xff0c;然而目前关于DDR4的资料非常少&#xff0c;尤其是针对SI(信号完整性)部分以及相关中文资料&#xff0c;另外一方面&#xff0c;DDR4的高速率非常容易引起…

【论文笔记】MCANet: Medical Image Segmentation withMulti-Scale Cross-Axis Attention

医疗图像分割任务中&#xff0c;捕获多尺度信息、构建长期依赖对分割结果有非常大的影响。该论文提出了 Multi-scale Cross-axis Attention&#xff08;MCA&#xff09;模块&#xff0c;融合了多尺度特征&#xff0c;并使用Attention提取全局上下文信息。 论文地址&#xff1a…

融云观察:给 ChatGPT 加上声音和脸庞,AI 社交的多模态试验

&#xff08;&#x1f446;点击获取行业首款《社交泛娱乐出海作战地图》&#xff09; 如果将短剧的爆火简单粗暴地归因为剧情上头、狗血反转和精妙卡点&#xff0c;那 GenAI 世界这一年来可以说是一部短剧 Live Show。关注【融云全球互联网通信云】了解更多 这厢 Open AI 宫斗…

别再唱衰Python了,未来十年Python的“霸榜”地位依旧!

直接说结论&#xff01;不管唱反调的人怎么唱衰&#xff0c;Python 在下一个十年仍然十分重要&#xff0c;并且依旧会与时俱进。 我们都知道 Python 是一门了不起的编程语言&#xff0c;它改变了编程的游戏规则&#xff0c;将编程的格局提升到了一个完全不同的层次。 Python 的…

【C++初阶】学习string类的模拟实现

目录 前言&#xff1a;一、创建文件和类二、实现string类2.1 私有成员和构造函数2.2 析构函数2.3 拷贝构造函数2.3.1 写法12.3.2 写法2 2.4 赋值重载函数2.4.1 写法12.4.2 写法2 2.5 迭代器遍历访问2.6 下标遍历访问2.7 reserve2.8 resize2.9 判空和清理2.10 尾插2.10.1 尾插字…

HTML CSS 进度条

1 原生HTML标签 <meter>&#xff1a;显示已知范围的标量值或者分数值<progress>&#xff1a;显示一项任务的完成进度&#xff0c;通常情况下&#xff0c;该元素都显示为一个进度条 1.1 <meter> <html><head><style>meter{width:200px;}…

新能源车企年底冲刺KPI,只能抓住“价格战”做文章?

新能源汽车行业的价格战似乎看不到尽头。 自特斯拉吹响号角后&#xff0c;今年以来&#xff0c;业内已然开启了几轮颇具规模的价格战。 如今进入年底&#xff0c;价格战不仅没有消停&#xff0c;还愈打愈烈。据不完全统计&#xff0c;12月&#xff0c;已有20多家车企先后开启…

Nginx快速入门:访问日志access.log参数详解 |访问日志记录自定义请求头(三)

0. 引言 在企业的生产环境中&#xff0c;我们时常需要通过nginx的访问日志来统计流量、排查调用问题等&#xff0c;而nginx默认的日志格式所包含的信息远无法满足我们使用&#xff0c;因此常常需要对日志进行自定义&#xff0c;所以今天我们就来看如何自定义nginx的访问日志格…

anaconda 安装 使用 pytorch onnx onnxruntime

一&#xff1a;安装 如果不是 x86_64&#xff0c;需要去镜像看对应的版本 安装 Anaconda 输入命令 bash Anaconda3-2021.11-Linux-x86_64.sh 然后输入 yes 表示同意 确认安装的路径&#xff0c;一般直接回车安装在默认的 /home/你的名字/anaconda3 很快就安装完毕。输入 yes…

星融元中标华夏银行项目,助力金融数据中心可视网建设工作

近日&#xff0c;星融元成功入围华夏银行国产品牌网络流量汇聚分流器&#xff08;TAP&#xff09;设备供应商&#xff0c;在助力头部金融机构构建数据中心可视网络的建设工作中&#xff0c;星融元又一次获得全国性股份制银行客户的青睐。 华夏银行作为全国性股份制商业银行积极…

如何在Ubuntu系统中安装VNC并结合内网穿透实现远程访问桌面

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

3d云渲染动画、效果图的速度,对比本地电脑渲染速度区别

与使用个人电脑进行渲染相比&#xff0c;3D云渲染服务擁有其无可比拟的优势。云端的服务器配置通常超出个人电脑&#xff0c;具有更强大的运算力和多任务并行处理的能力&#xff0c;使得同时执行多个渲染作业成为可能。这一点在处理图形复杂度高和数据量巨大的渲染项目时尤为显…

CEC2013(python):五种算法(OOA、WOA、GWO、DBO、HHO)求解CEC2013(python代码)

一、五种算法简介 1、鱼鹰优化算法OOA 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、蜣螂优化算法DBO 5、哈里斯鹰优化算法HHO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff1a; [1] Liang J J , Qu B Y , Suganthan P N , et al. Pro…

图片编辑文字用什么软件?带你了解这5个

图片编辑文字用什么软件&#xff1f;在当今数字化的时代&#xff0c;图片编辑已经成为我们日常生活中不可或缺的一部分。有时候&#xff0c;我们需要在图片上添加文字&#xff0c;以增强图片的视觉效果或传达特定的信息。那么&#xff0c;有哪些可以在图片上编辑文字的软件呢&a…