美文网首页
heap (堆)

heap (堆)

作者: Rokkia | 来源:发表于2018-03-15 11:56 被阅读22次

堆: 说实话在仔细研究堆之前,我一直将它跟堆栈混为了一个东西。还想着这是一个后进先出的东西。
我们来看一下什么是堆:
计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。
再来看一下堆得定义(核心):

n个元素序列{k1, k2... ki...kn},当且仅当满足下列关系时称之为堆:
(ki <= k2i, ki <= k2i+1)或者(ki >= k2i, ki >= k2i+1), (i = 1, 2, 3, 4... n/2)

堆两大使用:

  1. 更多用于动态数据的维护
  2. 提取前M个元素

生成一个堆

class HeapHeap(object):
    def __init__(self, size):
        self._heap = [0] * (size + 1)
        self._heap_count = 0

添加元素

    def insert_element(self, element):
        if self._heap_count == 0:
            #这里需要说一下,我们的堆是从数组第一个位置开始的so这里第一个元素为self._heap[1] = element
            self._heap[1] = element
            self._heap_count += 1
            return
        if self._heap_count == len(self._heap):
            return

        self._heap_count += 1
        self._heap[self._heap_count] = element
        self.reset_heap_up(self._heap_count)
    
    #这里我使用的是递归(自从快速排序那里用递归后,对递归很向往,于是这里也用了递归)
    def reset_heap_up(self, index):
        #这里使用index > 1来控制结束是因为index // 2有可能会是0,这样就不满足条件了
        if self._heap[index] > self._heap[index // 2] and index > 1:
            self._heap[index], self._heap[index // 2] = self._heap[index // 2], self._heap[index]
            self.reset_heap_up(index // 2)
        else:
            return

删除元素

    def remove_element(self):
        self._heap[1] = self._heap[self._heap_count]
        return_num = self._heap[self._heap_count]
        self._heap[self._heap_count] = -1
        self._heap_count -= 1
        self.reset_heap_down(1)
        return return_num
    
    #这里的思路是 将第一个元素与末尾元素交换,然后再将其转换为堆
    def reset_heap_down(self, index):
        j = index * 2  
        #确保不越界
        if j <= self._heap_count:
            #确保不越界,如果j + 1 < self._heap_count 说明有右孩子,这是比较两个孩子的大小,择大与父元素交换
            if j + 1 <= self._heap_count:
                change_index = j if self._heap[j] > self._heap[j + 1] else (j + 1)
            else:
                change_index = j
            #同时保证交换的孩子元素 > 父元素
            if self._heap[change_index] > self._heap[index]:
                self._heap[index], self._heap[change_index] = self._heap[change_index], self._heap[index]
            self.reset_heap_down(change_index)
        else:
            return

堆排序

    #根据堆的根元素肯定会是堆里面最大的元素,同时在数组中是第一个元素这一特性来进行排序
    def sort_heap(self):
        if self._heap_count == 1:
            return
        #将第一个跟最后一个元素交换,这样最后一个就成了最大值
        self._heap[self._heap_count], self._heap[1] = self._heap[1], self._heap[self._heap_count]
        #改变_heap_count避免再次堆化的时候重复执行
        self._heap_count -= 1
        #重新堆化
        self.reset_heap_down(1)
        self.sort_heap()

相关文章

  • 堆Heap

    Heap Heap: 堆。一般也称作Priority Queue(即优先队列) 堆我们一般用一个二叉树来表示。即一...

  • heap (堆)

    堆: 说实话在仔细研究堆之前,我一直将它跟堆栈混为了一个东西。还想着这是一个后进先出的东西。我们来看一下什么是堆:...

  • Heap 堆

    两种Heap Structure: 1. Max Heap parent node比 children node大...

  • 堆:Heap

    一:堆的介绍 Heap是一种数据结构具有以下的特点:1)完全二叉树;2)heap中存储的值是偏序; Min-hea...

  • 堆 (Heap)

    “堆”这种数据结构常用在“优先级队列”的实现上, 比如Java中的PriorityQueue。今天讲讲什么是堆,如...

  • 堆(Heap)

    堆(Heap) 堆是一种常用的树形结构,是一种特殊的完全二叉树,当且仅当满足所有节点的值总是不大于或不小于其父节点...

  • 堆(heap)

    什么是堆? 堆是满足下面两个条件的一种二叉树 它是一棵完全二叉树; 堆中每个节点的值都必须大于等于(大根堆)或者小...

  • 堆 - Heap

    基本概念 堆是一种数据结构,定义为一棵完全二叉树。假如用数组储存堆结构,那么对于某个index为i的节点来说,它的...

  • 堆(heap)

    如何理解“堆”? 堆是一种特殊的树。满足两点要求。 堆是一个完全二叉树;完全二叉树要求,除了最后一次,其他层的节点...

  • 堆-Heap

    堆-Heap 堆的基本接口设计 二叉堆(最大堆) 大顶堆-添加 大顶堆-删除 删除堆顶元素的同时插入一个新元素 大...

网友评论

      本文标题:heap (堆)

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