美文网首页
数据结构-堆

数据结构-堆

作者: 想当厨子的程序员 | 来源:发表于2018-09-18 20:04 被阅读0次

堆(最小堆)

I 堆化操作

遍历根节点,并且每个根节点都做到下沉。

II 出堆

放出堆顶的元素, 把最后一个元素放到堆顶来下沉。

III 进堆

放入某元素到堆末尾,然后用这末尾的最后一个元素来做上浮操作。

代码

class MyHeap:
    def __init__(self, not_heap):
        self.heap = not_heap[:]
        n = len(self.heap)
        for i in reversed(range(0, (n-1)//2+1)):
            root = i
            while(2*root+1<n):
                leap_small = 2 * root + 1
                if 2 * root + 2 < n and self.heap[2 * root + 2] < self.heap[2 * root + 1]:
                    leap_small = 2 * root + 2
                if self.heap[root] > self.heap[leap_small]:
                    self.heap[root], self.heap[leap_small] = self.heap[leap_small], self.heap[root]
                    root = leap_small
                else:
                    break
        print(self.heap)

    def push(self, n):
        self.heap.append(n)
        i = len(self.heap) - 1
        while(i > 0):
            root = int(str((i - 1) / 2)[:1])
            if self.heap[i] < self.heap[root]:
                leap = self.heap[root]
                self.heap[root] = self.heap[i]
                self.heap[i] = leap
            i = root

    def pop(self):
        result = self.heap[0]
        self.heap[0] = self.heap[-1]
        self.heap.pop()
        n = len(self.heap)
        root = 0
        while(2 * root + 1 < n):
            leap_small = 2 * root + 1
            if 2 * root + 2 < n and self.heap[2*root+2] < self.heap[2*root+1]:
                leap_small = 2 * root + 2
            if self.heap[root] > self.heap[leap_small]:
                leap = self.heap[root]
                self.heap[root] = self.heap[leap_small]
                self.heap[leap_small] = leap
                root = leap_small
        return result

    def top(self):
        return self.heap[0]

Heapq库

我这个实现的堆结果与常用python库 heapq的结果一致,但是性能未进行比较。常用操作有以下这些:

import heapq
heapq.heapify(list)
heapq.heappush(list, n)
m = heapq.heappop(list)

相关文章

  • 堆结构的实现

    堆的定义: 这里的堆是指一种数据结构(或数据结构属性),非指堆内存。堆属性用二叉树来体现,具有堆属性的数据结构才可...

  • 看图说话数据结构之二项队列(优先队列)——原理解析

    数据结构之二叉堆(优先队列)——原理解析,数据结构之二叉堆(优先队列)——java实现,数据结构之左式堆(优先队列...

  • 栈和堆以及栈区和堆区的区别

    栈和堆以及栈区和堆区的区别 数据结构中的栈和堆 栈:具有先进后出性质的数据结构 堆:一种经过排序的树形数据结构,节...

  • 数据结构中堆、栈和队列的理解

    一、堆 堆是一种经过排序的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构是指二叉树。所以堆在数据结构...

  • iOS堆、栈和队列

    堆 堆是一种经过排序的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构是指二叉树。所以堆在数据结构中通...

  • 通俗易懂:C语言中内存堆和栈的区别

    数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。 堆和栈都是...

  • 数据结构--堆

    堆有两个特性: 堆是一个完全二叉树 堆中所有父节点都大于(最大堆)或者小于(最小堆)子结点。在一般的实现中,我们可...

  • 数据结构-堆

    堆(最小堆) I 堆化操作 遍历根节点,并且每个根节点都做到下沉。 II 出堆 放出堆顶的元素, 把最后一个元素放...

  • 数据结构-堆

    定义 优先队列:一种特殊的队列,队列中元素出栈的顺序是按照元素的优先权大小,而不是元素入队的先后顺序。 堆的特性:...

  • 数据结构-堆

    堆(heap)又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。回忆一下,在队列中...

网友评论

      本文标题:数据结构-堆

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