IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> python数据结构——优先级队列,利用最小堆实现 -> 正文阅读

[数据结构与算法]python数据结构——优先级队列,利用最小堆实现

python的堆模块,heapq,默认为小根堆,操作:

heapq.heappush(heap,x)? ?#把x压入堆

heapq.heappop(heap)

heapq.heapreplace(heap,x) #删除最小根,然后压入x

heapq.heapify([2,5,1])? #让列表具有堆特征

用heapq实现大根堆时,入堆和出堆操作,变换为push(-e),? -pop(e)?.

  • from pythonds.trees import BinaryHeap
  • 堆heap,可以看做一个完全二叉树的数组对象。常见的堆有二叉堆和斐波那契堆。二叉堆的变体中,根据根节点的最大和最小分为最大堆和最小堆。
  • 我们用来存储堆元素的方法依赖堆的有序性:对于堆中任意元素x,x及其父元素p,总是有p<=x。
  • 完全二叉树: 除了底层,其他层的节点都是满的。在最底层,从左往右填充节点。
  • 实现优先级队列的经典方法是二叉堆,即一棵用列表来表达的二叉树。父节点下标为i,子节点的下标为2*i,2*i+1。节点m的父节点为m/2。
  • 优先级队列的插入和删除。插入:先插入到列表最后,然后上浮。删除:最后一个元素调换到根节点,将其下沉。

二叉堆的操作7个

BinaryHeap()? #创建空的二叉堆

BuildHeap(list)? 根据列表创建二叉堆

insert(k)? ?插入元素

findMin()? ? 返回最小值

delMin()? ?返回最小值并删除根节点

isEmpty()? ?判断堆是否为空

size()? ?返回堆的元素个数

创建空的二叉堆

class BinaryHeap:
    def __ini__(self):
        self.heapList=[0]
        self.currentsize=0

insert(k)

def insert(self):
        self.heapList.append(k)
        self.currentsize+=1
        self.percUp(self.currentsize)

def percUp(self,i):
        while i//2>0:
            if self.heapList[i]<self.heapList[i//2]:
                temp=self.heapList[i//2]
                self.heapList[i//2]=self.heapList[i]
                self.heapList[i]=temp
            i=i//2

?delMin()。问题:移除根节点之后,怎么重建堆的有序性和结构性质。1.把最后一个元素移到根节点,保证结构性质。2.元素下沉,保证有序性。

def delMin(self):
        re=self.heapList[1]
        self.heapList[1]=self.heapList[self.currentsize]
        self.currentsize-=1
        self.heapList.pop()
        self.percDown(1)
        return re

def percDown(self,i):
    while i*2<=self.currentsize
        m=minChild(i)
        if self.heapList[m]<self.heapList[i]:
            temp=self.heapList[m]
            self.heapList[m]=self.heapList[i]
            self.heapList[i]=temp
        i=m

def minChild(self,i):
    if 2*i+1>self.currentsize
        return 2*i
    else:
        if self.heapList[2*i]<self.heapList[2*i+1]:
            return 2*i
        else:
            return 2*i+1

BuildHeap(list) 根据已有的列表创建二叉堆,时间复杂度为O(n)。从倒数第二层的节点开始,每个节点依次下沉,i-=1。

def BuildHeap(self,alist):
    self.heapList=[0]+alist[:]
    self.currentsize=len(alist)
    i=len(alist)//2
    while i>0:
        self.percDown(i)
        i=i-1
        

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:23:44  更:2022-02-03 01:25:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:38:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码