iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >【算法——Python实现】最大堆和最小
  • 243
分享到

【算法——Python实现】最大堆和最小

算法大堆最小 2023-01-31 03:01:01 243人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

# _*_ encoding:utf-8 _*_ """ 最大堆 """ class MaxHeap(object): # def __init__(self): # self.data = [] # 创

# _*_ encoding:utf-8 _*_
"""
最大堆
"""


class MaxHeap(object):
    # def __init__(self):
    #   self.data = []  # 创建堆
    #   self.count = len(self.data)  # 元素数量

    def __init__(self, arr):
        self.data = copy.copy(arr)
        self.count = len(self.data)
        i = self.count / 2
        while i >= 1:
            self.shiftDown(i)
            i -= 1

    def size(self):
        return self.count

    def isEmpty(self):
        return self.count == 0

    def insert(self, item):
        # 插入元素入堆
        self.data.append(item)
        self.count += 1
        self.shiftup(self.count)

    def shiftup(self, count):
        # 将插入的元素放到合适位置,保持最大堆
        while count > 1 and self.data[(count/2)-1] < self.data[count-1]:
            self.data[(count/2)-1], self.data[count-1] = self.data[count-1], self.data[(count/2)-1]
            count /= 2

    def extractMax(self):
        # 出堆
        if self.count > 0:
            ret = self.data[0]
            self.data[0], self.data[self.count-1] = self.data[self.count-1], self.data[0]
            self.data.pop()
            self.count -= 1
            self.shiftDown(1)
            return ret

    def shiftDown(self, count):
        # 将堆的索引位置元素向下移动到合适位置,保持最大堆
        while 2 * count <= self.count :
            # 证明有孩子
            j = 2 * count
            if j + 1 <= self.count:
                # 证明有右孩子
                if self.data[j] > self.data[j-1]:
                    j += 1
            if self.data[count-1] >= self.data[j-1]:
                # 堆的索引位置已经大于两个孩子节点,不需要交换了
                break
            self.data[count-1], self.data[j-1] = self.data[j-1], self.data[count-1]
            count = j

class MinHeap(object):
    """最小堆"""
    def __init__(self):
        self.data = []  # 创建堆
        self.count = len(self.data)  # 元素数量

    # def __init__(self, arr):
    #   self.data = copy.copy(arr)
    #   self.count = len(self.data)
    #   i = self.count / 2
    #   while i >= 1:
    #       self.shiftDown(i)
    #       i -= 1

    def size(self):
        return self.count

    def isEmpty(self):
        return self.count == 0

    def insert(self, item):
        # 插入元素入堆
        self.data.append(item)
        self.count += 1
        self.shiftup(self.count)

    def shiftup(self, count):
        # 将插入的元素放到合适位置,保持最小堆
        while count > 1 and self.data[(count/2)-1] > self.data[count-1]:
            self.data[(count/2)-1], self.data[count-1] = self.data[count-1], self.data[(count/2)-1]
            count /= 2

    def extractMin(self):
        # 出堆
        if self.count > 0:
            ret = self.data[0]
            self.data[0], self.data[self.count-1] = self.data[self.count-1], self.data[0]
            self.data.pop()
            self.count -= 1
            self.shiftDown(1)
            return ret

    def shiftDown(self, count):
        # 将堆的索引位置元素向下移动到合适位置,保持最小堆
        while 2 * count <= self.count :
            # 证明有孩子
            j = 2 * count
            if j + 1 <= self.count:
                # 证明有右孩子
                if self.data[j] < self.data[j-1]:
                    j += 1
            if self.data[count-1] <= self.data[j-1]:
                # 堆的索引位置已经小于两个孩子节点,不需要交换了
                break
            self.data[count-1], self.data[j-1] = self.data[j-1], self.data[count-1]
            count = j

--结束END--

本文标题: 【算法——Python实现】最大堆和最小

本文链接: https://www.lsjlt.com/news/187245.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【算法——Python实现】最大堆和最小
    # _*_ encoding:utf-8 _*_ """ 最大堆 """ class MaxHeap(object): # def __init__(self): # self.data = [] # 创...
    99+
    2023-01-31
    算法 大堆 最小
  • Java中PriorityQueue实现最小堆和最大堆的用法
    目录一、基本介绍 1、介绍2、用法3、最小堆4、最大堆5、其他优先级二、常用方法三、相关练习题一、基本介绍  1、介绍 学习很多算法知识,力争做到最优解的学习过程...
    99+
    2024-04-02
  • Python实现最大堆(大顶堆)
    最大堆是指最大的元素在堆顶的堆。Python自带的heapq模块实现的是最小堆,没有提供最大堆的实现。虽然有些文章通过把元素取反再放入堆,出堆时再取反,把问题转换为最小堆问题也能间接实现最大堆,但是这样的实现只适合数值型的元素,不适合自定...
    99+
    2023-01-31
    大堆 Python 大顶堆
  • Java数据结构之最小堆和最大堆的原理及实现详解
    目录一、前言二、堆的数据结构三、堆的代码实现1. 实现介绍2. 入堆实现3. 出堆实现4. 小堆实现5. 大堆实现一、前言 堆的历史 堆的数据结构有很多种体现形式,包括;2-3堆、B...
    99+
    2024-04-02
  • Java语言如何实现最大堆
    这篇文章将为大家详细讲解有关Java语言如何实现最大堆,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最大堆最大堆的特点是父元素比子元素大,并且是一棵完全二叉树。data[1]开始存,data[0]空着不用...
    99+
    2023-05-30
    java
  • javascript实现数组最大值和最小值的6种方法
    给定一个数组[1,8,5,4,3,9,2],编写一个算法,得到数组的最大值 9,和最小值 1。 1、通过prototype属性扩展min()函数和max()函数 算法1的思路是在自...
    99+
    2024-04-02
  • javascript如何实现数组最大值和最小值
    小编给大家分享一下javascript如何实现数组最大值和最小值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!给定一个数组[1,8,5,4,3,9,2],编写一个...
    99+
    2023-06-15
  • python辗转相除法求最大公约数和最小公倍数的实现
    目录辗转相除法求最大公约数和最小公倍数辗转相除法数学原理python代码实现用递归的方式实现Python3 20.辗转相除法算法分析源代码结果截图辗转相除法求最大公约数和最小公倍数 ...
    99+
    2024-04-02
  • Java实现二叉堆、大顶堆和小顶堆
    目录什么是二叉堆什么是大顶堆、小顶堆建堆程序实现建立大顶堆逻辑过程程序实现建立小顶堆逻辑过程程序实现从堆顶取数据并重构大小顶堆什么是二叉堆 二叉堆就是完全二叉树,或者是靠近完全二叉树...
    99+
    2024-04-02
  • 怎么用Python求最大值和最小值
    本篇内容介绍了“怎么用Python求最大值和最小值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! minimum:合集中的最小值;...
    99+
    2023-06-15
  • python最小堆排序怎么找
    要使用Python实现最小堆排序,可以按照以下步骤进行: 创建一个最小堆函数。在该函数中,可以使用heapq模块的heapify函...
    99+
    2023-10-26
    python
  • Python算法题----最大公约数
    求最大公约数,辗转相除法。仍然是递归和递推的算法。不解释,上代码。 def divideNum01(n1, n2):     while n1 % n2 != 0:         r = n1 % n2         n1 = n2  ...
    99+
    2023-01-31
    最大公约数 算法 Python
  • Java如何实现二叉堆、大顶堆和小顶堆
    这篇文章将为大家详细讲解有关Java如何实现二叉堆、大顶堆和小顶堆,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是二叉堆二叉堆就是完全二叉树,或者是靠近完全二叉树结构的二叉树。在二叉树建树时采取前序建...
    99+
    2023-06-29
  • JavaScript中二叉树如何实现查找最小值、最大值、给定值算法
    小编给大家分享一下JavaScript中二叉树如何实现查找最小值、最大值、给定值算法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:function Node(data,...
    99+
    2024-04-02
  • 兼容IE6的网页最小最大宽度和最小最大高度css写法是怎样的
    兼容IE6的网页最小最大宽度和最小最大高度css写法是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 ...
    99+
    2024-04-02
  • python groupby函数实现分组选取最大值与最小值
    现在需要将course分组,然后选择出每一组里面的最大值和最小值,并保留下来 实现下面数据结果: 直接使用groupby函数,不能直接达到此效果,需要在groupby函数上添加a...
    99+
    2024-04-02
  • python怎么找出列表最大值和最小值
    Python中可以使用内置函数max()和min()来找出列表的最大值和最小值。 示例代码如下: my_list = [4, 2, ...
    99+
    2024-02-29
    python
  • python如何求列表的最大值和最小值
    可以使用内置的`max()`和`min()`函数来求列表的最大值和最小值。示例如下:```pythonnumbers = [1, 2...
    99+
    2023-09-13
    python
  • Java实现最小生成树算法详解
    目录定义带权图的实现Kruskal 算法二叉堆并查集实现算法Prim 算法定义 在一幅无向图G=(V,E) 中,(u,v) 为连接顶点u和顶点v的边,w(u,v)...
    99+
    2024-04-02
  • 详解Java如何实现小顶堆和大顶堆
    大顶堆 每个结点的值都大于或等于其左右孩子结点的值 小顶堆 每个结点的值都小于或等于其左右孩子结点的值 对比图 实现代码 public class HeapNode{ ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作