堆1

作者: Arsenal4ever | 来源:发表于2020-01-01 22:43 被阅读0次

上半部分

二叉堆:有两种,分最大堆和最小堆。

最小堆的写法:

class BinaryHeap:
    def __init__(self):
        self.heapList = [0]
        self.currentSize = 0

    def insert(self, k):
        self.heapList.append(k)
        self.currentSize += 1       # 增加到最后位置
        self.percUp(self.currentSize)   # 进行上浮操作,和父节点进行比较

    def percUp(self, i):
        while i // 2 > 0:       # i // 2 表示它的父节点,二叉树的性质
            if self.heapList[i] > self.heapList[i // 2]:
                self.heapList[i], self.heapList[i // 2] = self.heapList[i // 2], self.heapList[i]
            i //= 2

    def delMin(self):
        # 用右节点代替堆顶节点,还要写下沉

        # 移出堆顶
        retVal = self.heapList[1]
        # 把最后一个搬到堆顶来
        self.heapList[1] = self.heapList[self.currentSize]
        self.currentSize -= 1
        self.heapList.pop()
        self.percDown(1)
        return retVal

    def percDown(self. i):
        # 将父节点与左右子孩子中较小的进行比较
        while (i * 2) <= self.currentSize:
            mc = self.minChild(i)
            if self.heapList[i] > self.heapList[mc]:
                self.heapList[i], self.heapList[mc] = self.heapList[mc], self.heapList[i]
            i = mc

    def minChild(self, i):
        # 返回子孩子中较小的
        if i * 2 + 1 > self.currentSize:
            return i * 2
        else:
            if self.heapList[i * 2] < self.heapList[i * 2 + 1]:
                return i * 2
            else:
                return i * 2 + 1

    def buildHeap(self, alist):
        # 将列表转换成堆 --- > 从中间开始不断下沉
        i = len(alist) // 2
        self.currentSize = len(alist)
        self.heapList = [0] + alist[:]
        while (i > 0):
            self.percDown(i)
            i -= 1

下半部分

堆主要包括5种操作:

  1. 取出堆顶元素:H.top()
  2. 判断堆是否为空:H.empty()
  3. 将元素 x 添加至堆:H.push(x)
  4. 弹出堆顶:H.pop()
  5. 求堆存储元素的个数:H.size()

最大堆:父节点的值总是大于或等于任何一个子节点的值。
最小堆:父节点的值总是小于或等于任何一个子节点的值。

微信图片_20200101223506.png

demo1:数组中第 k 大的数(medium)

来源:leetocde 215

对堆的手写一般没要求啊!!!所以,我可以用 max 和 min 组合列表的方式来代替堆?

class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        l = nums[:k]

        for i in range(k, len(nums)):
            if nums[i] > min(l):
                l.remove(min(l))
                l.append(nums[i])
        return min(l)

demo2:寻找中位数(Hard)

来源:leetcode 295

将数组劈开,维护一个最大堆和最小堆。然后比较最大堆和最小堆元素个数,画状态机。

代码尚未完善好!直接看 leetcode 评论解答!!!

相关文章

  • 堆-1

    堆 堆(优先级队列,Priority Queue)是一个完全二叉树另加上一个条件:父节点的值总比两个子节点的值大(...

  • 堆1

    上半部分 二叉堆:有两种,分最大堆和最小堆。 最小堆的写法: 下半部分 堆主要包括5种操作: 取出堆顶元素:H.t...

  • 锦灰堆1

    早就想记录一下我的那些小无用,还是叶老师催促,记录一下。 那就以这对小籽料说起。因为这几天一块秋梨皮的小籽掀翻了和...

  • 萌版堆图1

  • 13.堆Heap

    目录:1.堆的概念2.堆的性质3.堆定义操作4.堆的实现 1.堆的概念 1.1 优先队列:Priority Que...

  • 10.11java中的堆和栈

    java高级-堆和栈 java堆 /栈 栈内存 / 堆内存的区别 1. java堆 /栈 2. 栈内存 / 堆内存的区别

  • 《刻意练习》读书笔记1

    引言:天才存在吗? 沙堆悖论:1粒沙子不是堆。如果1粒沙子不是堆,那么2粒沙子也不是堆;如果2粒沙子不是堆,那么3...

  • JVM调优

    常见配置汇总 堆设置 -Xmn:新生代大小 占堆大小1/3或1/4 -Xms:初始堆大小 -Xmx:最大堆大...

  • 一道六年级数学奥数题的多种解题思路和方法。

    有甲、乙两堆黄沙共114吨,第一次从甲堆中运出甲堆总数的1/4,从乙堆中运出乙堆总数的1/5;第二次从甲堆中运出甲...

  • 小根堆的应用1

    思路:利用小根堆实现

网友评论

    本文标题:堆1

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