Python -堆的实现

最小(大)堆是按完全二叉树的排序顺序的方式排布堆中元素的,并且满足:ai  >a(2i+1)  and ai>a(2i+2)( a <a(2i+1)  and ai<a(2i+2)).堆是一种高级的数据结构,在Python中,有相应的模块deapq。

下面给出自己编写的代码实现最小堆与使用heapq模块实现最小堆作一个对比:

#定义Myheap类

import heapq as p
import random
class MyHeap(object):
    def __init__(self,arr=[]):
        self.n=len(arr)
        self.list=arr
    def creat_heap(self):
        p.heapify(self.list) #建堆
        return self.list
    def creat_heap1(self):
        parent_num=(self.n-1)/2
        while 0<=parent_num:
            self.siftdown(parent_num)
            parent_num-=1
        return self.list
    def siftdown(self,parent_num):
        i=parent_num
        j=2*parent_num+1
        temp=self.list[parent_num]
        while j<self.n :
            if j<self.n-1 and self.list[j+1]<self.list[j] :
                j=j+1
            if temp<=self.list[j]:
                break
            else:
                self.list[i]=self.list[j]
                i=j
                j=2*i+1
        self.list[i]=temp
    def heap_sort(self): #堆排序
        b=[]
        for i in xrange(self.n):
             p.heapify(self.list)
             b.append(p.heappop(self.list))
        return b
        

测试:

1 a1=[random.randint(1,100) for i in xrange(10)]
2 print a1
3 myheap1=MyHeap(a1)
4 myheap2=MyHeap(a1)
5 print myheap1.creat_heap()
6 print myheap2.creat_heap1()
7 print myheap1.heap_sort()

结果:

[86, 44, 34, 10, 85, 30, 62, 60, 53, 21]
[10, 21, 30, 44, 85, 34, 62, 60, 53, 86]
[10, 21, 30, 44, 85, 34, 62, 60, 53, 86]

时间: 2024-07-30 22:01:07

Python -堆的实现的相关文章

Python如何管理内存?

对于Python来说,内存管理涉及所有包含Python对象和堆. Python内存管理器在内部确保对堆的管理和分配. Python内存管理器具有不同的组件,可处理各种动态存储管理方面,如共享,分段,预分配或缓存. 在最低级别,原始内存分配器确保堆中有足够的空间通过与操作系统的内存管理器交互来存储所有与Python相关的数据.在原始内存分配器之上,几个特定于对象的分配器在同一堆上运行,并实现适合于每种对象类型的特性的不同内存管理策略. 例如,整数对象在堆内的管理方式与字符串,元组或字典不同,因为整

Python猫荐书系列之五:Python高性能编程

稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非 Python 与 Go 莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资-- 对于编程语言的争论,就是猿界的生理周期,每个月都要闹上一回.到了年末,各类榜单也是特别抓人眼球,闹得更凶. 其实,它们各有对方所无法比拟的优势以及用武之地,很多争论都是没有必要的.身为一个正在努力学习 Python 的(准)中年程序员,我觉得吧,先把一门语言精进了再说.没有差劲的语言,只有差劲的程序员,等真的把语言学好了,必定是"

学习资料整理

1.Sql导入数据方式:(1)软件选择导入,分隔符类型,直接导入 (2)写入代码导入 2.Hadoop下载安装:官网下载安装 3.HDFS HDFS的可靠性:创建了多份数据备份,放置在了其他计算机节点中,读取速度也很快. 结构:NameNode(元数据 内存)和DataNodes(文件内容 磁盘) 运行机制:(1)一个名字节点和多个数据节点 (2)故障检测 计算机网络 1 电路交换与分组交换的区别是什么?优劣对比? 答:先介绍基本概念: 电路交换 概念:必须经过建立连接(占用通信资源)--->通

[硕.Love Python] BinomialHeap(B堆 & 二项堆)

class Node(object):     def __init__(self, data):         self.data = data         self.child = None         self.left = None         self.right = None         self.degree = 0     def __str__(self):         return str(self.data)     __repr__ = __str_

[硕.Love Python] FibonacciHeap(F堆 & 斐波那契堆)

class Node(object):     __slots__ = [         'data', 'child', 'left', 'right',         'degree', 'parent', 'childCut',     ]     def __init__(self, data):         self.data = data         self.child = None         self.left = None         self.right

从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构

Top N问题在搜索引擎.推荐系统领域应用很广, 如果用我们较为常见的语言,如C.C++.Java等,代码量至少也得五行,但是用Python的话,只用一个函数就能搞定,只需引入heapq(堆队列)这个数据结构即可.今天偶然看到这个库,特意记下之. 先看一个例子: 1 >>> import heapq 2 >>> nums = [1,8,2,23,7,-4,18,23,42,37,2] 3 >>> print heapq.nlargest(3, nums

python学习笔记29(python中堆的使用)

堆(heap):优先队列的一种,使用优先队列能够以任意顺序增加对象,并且能在任意时间(可能在增加对象的同时)找到(也可能是移除)最小元素,比用于列表中min的方法要高效. Python中并没有独立的堆类型,只有一个包涵一些堆操作函数的模块,这个模块叫heapq. import heapq 1.heapq.heappush(heap,item)  #heap为定义堆,item 增加的元素; eg. heap=[]   heapq.heappush(heap, 2) 2.heapq.heapify(

python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列

标准库:一些最爱 集合.堆和双端队列 集合 集合Set类位于sets模块中. >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> set(range(10)) set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 集合是由序列(或其他可迭代的对象)构建的.主要用于检查成员资格,因此,副本是被忽略的: >>> range(10)*2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9

二叉堆 及 大根堆的python实现

Python 二叉堆(binary heap) 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆. 当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆. 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆. 二叉堆的存储 二叉堆一般用数组来表示.如果根节点在数组中的位置是1,第n个位置的子节点分别在2n和 2n+1.因此,第1个位置的子节点在2和3,第2