二叉堆

作者: 后现代主义蜗牛 | 来源:发表于2017-03-20 22:36 被阅读0次

二叉堆时一个我目前掌握的一个比较复杂(对我来说)的数据结构了。特地用python写了一个,虽然python提供现成的二叉堆这个数据结构,效率肯定时吊打我写的这个东东了,不过练习一些也是好事。

写二叉堆时自己犯的几个错误或需要注意的地方:

1.堆的开始是0还是1,导致后边数列的序号应该是count还是count+1还是count-1
2.堆的count变化应该写在什么位置,比如这里-shiftDown中的count=j这个命令我写在了if里边,导致有时候会出现死循环。
3.注意越界判断。

自己实现的一个二叉堆:
import random
class zuixiaodui:
    _count=0
    _capacity=0
    _data=[0]
    def __init__(self,capacity):
        self._capacity=capacity
        self._data=[0]*capacity

    def _shiftUp(self,count):
        if count<=self._count and count>0:
            while self._data[count]<self._data[count/2] :
                self._data[count],self._data[count/2]=self._data[count/2],self._data[count]
                count=count/2

    def _shiftDown(self,count):
        if count>0:
            while count*2 < self._count:
                j=count*2
                if j>self._count:
                    return
                elif self._data[j] > self._data[j+1] and j+1 < self._count:
                    j=j+1

                if self._data[count]>self._data[j]:
                    self._data[count],self._data[j]=self._data[j],self._data[count]
                count=j



    def insert(self,value):
        if self._count+1<self._capacity:
            self._count+=1
            self._data[self._count]=value
            self._shiftUp(self._count)
        else:
            print 'FULL'

    def extractMin(self):
        item=self._data[1]
        self._data[1]=self._data[self._count]
        self._data[self._count]=0
        self._count-=1
        self._shiftDown(1)
        return item

    def size(self):
        return self._count

    def isEmpty(self):
        return self._count==0
    def getItem(self,i):
        return  self._data[i]



if __name__ == '__main__':
    c=zuixiaodui(11)
    for i in range(10):
        c.insert(random.randint(1,10))
    print c.isEmpty(),c.size()

    for i in range(10):
        print c.extractMin()

相关文章

  • 用go实现二叉堆插入删除构建

    二叉堆的插入: 二叉堆的删除: 二叉堆的构建:

  • [数据结构与算法-iOS 实现]二叉堆原理实现及top k 问题

    二叉堆 demo 二叉堆其实就是一颗完全二叉树,所以又可以叫做完全二叉堆 二叉堆的底层可以用数组来实现 对于二叉堆...

  • 二叉堆

    二叉堆定义 二叉堆是一种特殊的堆, 二叉堆是完全二叉树或者近似完全二叉树. 二叉堆满足堆特性: 父节点的键值总是保...

  • 二叉堆(Binary Heap)

    二叉堆这个数据结构有点意思,自己做了个总结,内容结构如下: 二叉堆性质 二叉堆操作 应用 二叉堆性质: 堆(Hea...

  • 堆排序(下):最大堆

    二叉堆,简称堆 Heap 尖的完全二叉树。也有三叉堆以及普通堆,但大部分时候堆就是指二叉堆 二叉堆的定义 一棵完全...

  • 二叉堆的Python实现

    二叉堆(binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的...

  • Sort.堆排序(heapsort) & 优先队列

    二叉堆 这个二叉堆和先进后出的那个堆不是一个。而且这个二叉堆从下标1开始存储元素。 这里的二叉堆是个数组,也可以看...

  • 二叉树(二)-二叉堆

    1.什么是二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。二叉堆有两种:...

  • PriorityQueue源码解析

    PriorityQueue 一个基于优先级堆的无界优先级队列。 二叉堆 可视化操作:二叉堆 二叉堆(The bin...

  • 数据结构(8) 二叉堆

    二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。 二叉堆实用数组来表示,存贮节点...

网友评论

      本文标题:二叉堆

      本文链接:https://www.haomeiwen.com/subject/ojujnttx.html