首页 > 其他分享 >数据结构-堆

数据结构-堆

时间:2024-04-13 16:22:43浏览次数:17  
标签:heapq self 元素 最小 smallest heap 数据结构

数据结构-堆

1. 定义:

堆是一种特殊的完全二叉树。在堆中,所有的父节点都满足特定的顺序关系(大于或小于)与它们的子节点。这种属性使得堆在处理优先级队列和排序操作时非常有效。

2. 类型:

常见的两种类型的堆是最大堆和最小堆。在最大堆中,每个父节点的值都大于或等于其子节点的值;而在最小堆中,每个父节点的值都小于或等于其子节点的值。

3. 操作:

主要操作包括插入(添加新元素)和删除(移除顶部元素)。插入操作涉及将新元素添加到堆的末尾,然后进行上浮调整。删除操作通常移除顶部元素,然后将末尾元素移到顶部,并进行下沉调整以保持堆的属性。
在 Python 中,可以使用 heapq 模块来表示和操作堆数据结构。heapq 提供了一些实用函数来操作最小堆和最大堆(可以通过对输入数据的负值进行处理来实现最大堆)。堆通常是一种二叉堆数据结构,是一种特殊的树结构,它满足堆的性质,即父节点的值小于或等于其子节点的值。
下面是一些 heapq 模块的基本操作示例:

  1. heapq.heappush(heap, item):向堆中插入一个元素 item。
  2. heapq.heappop(heap):从堆中弹出最小元素,并返回该元素。
  3. heapq.heapify(x):将列表 x 转换为堆。
  4. heapq.heappushpop(heap, item):向堆中插入一个元素 item,然后弹出堆中的最小元素。
  5. heapq.heapreplace(heap, item):将堆中的最小元素替换为新元素 item。
  6. heapq.nlargest(n, iterable):返回 iterable 中的前 n 个最大元素。
  7. heapq.nsmallest(n, iterable):返回 iterable 中的前 n 个最小元素。
import heapq

# 创建一个空的列表作为堆
heap = []

# 向堆中插入元素
heapq.heappush(heap, 5)
heapq.heappush(heap, 2)
heapq.heappush(heap, 8)
heapq.heappush(heap, 3)

# 输出堆中的最小元素
print("堆中的最小元素:", heapq.heappop(heap))

# 在堆中插入一个新元素并弹出最小元素
print("插入新元素 4 并弹出最小元素:", heapq.heappushpop(heap, 4))

# 将列表转换为堆
data = [5, 1, 9, 3, 6]
heapq.heapify(data)
print("转换后的堆:", data)

# 查找列表中前 3 个最小元素
print("列表中前 3 个最小元素:", heapq.nsmallest(3, data))

# 查找列表中前 2 个最大元素
print("列表中前 2 个最大元素:", heapq.nlargest(2, data))

不使用模块

class MinHeap:
    def __init__(self):
        self.heap = []

    def parent(self, i):
        return (i - 1) // 2

    def left(self, i):
        return 2 * i + 1

    def right(self, i):
        return 2 * i + 2

    def insert(self, key):
        self.heap.append(key)
        i = len(self.heap) - 1
        while i != 0 and self.heap[self.parent(i)] > self.heap[i]:
            self.heap[self.parent(i)], self.heap[i] = self.heap[i], self.heap[self.parent(i)]
            i = self.parent(i)

    def heapify(self, i):
        smallest = i
        l = self.left(i)
        r = self.right(i)

        if l < len(self.heap) and self.heap[l] < self.heap[smallest]:
            smallest = l

        if r < len(self.heap) and self.heap[r] < self.heap[smallest]:
            smallest = r

        if smallest != i:
            self.heap[i], self.heap[smallest] = self.heap[smallest], self.heap[i]
            self.heapify(smallest)

    def extract_min(self):
        if len(self.heap) == 0:
            return None

        root = self.heap[0]
        self.heap[0] = self.heap[-1]
        self.heap.pop()
        self.heapify(0)

        return root

# 示例用法
heap = MinHeap()
heap.insert(5)
heap.insert(2)
heap.insert(8)
heap.insert(3)

print("堆中的最小元素:", heap.extract_min())  # 输出:2
print("堆中的最小元素:", heap.extract_min())  # 输出:3

4. 应用:

堆在多种算法和数据结构中有广泛应用,如堆排序、优先级队列、带权图的最短路径算法(如Dijkstra算法)、和哈夫曼编码等。

5. 时间复杂度:

堆的操作通常具有高效的时间复杂度。例如,插入和删除操作通常具有对数时间复杂度(O(log n)),这使得它们在处理大量数据时仍然保持高效。

标签:heapq,self,元素,最小,smallest,heap,数据结构
From: https://www.cnblogs.com/zx-demo/p/18133017

相关文章

  • 数据结构-哈希表
    数据结构-哈希表1.定义:哈希表(也称为散列表)是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过将键映射到表中一个位置来访问记录,从而加快访问速度。#创建一个空字典hash_table={}#向哈希表中添加键-值对hash_table['apple']=10hash_table['banana'......
  • 数据结构-链表
    数据结构-链表1.链表的基本概念:链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向列表中下一个节点的引用(或指针)。2.单向链表:单向链表的每个节点只有一个指向下一个节点的链接。这种结构使得遍历只能单向进行,从头节点开始到尾节点结束。classNode:d......
  • 数据结构基础概念
    数据结构基础概念数据结构概念数据结构是计算机科学中用于组织和存储数据的方式。它定义了数据之间的关系,提供了一组操作以访问和修改数据。选择合适的数据结构对于解决特定问题至关重要,不同的数据结构适用于不同的应用场景。以下是数据结构的基本概念:数据元素:数据结构中的基......
  • 数据结构知识框架
    数据结构知识框架B树平衡的多叉树性质根结点至少有两个孩子每个非根结点至少有M/2(上取整)个孩子,至多有M个孩子每个非根结点至少有M/2-1(上取整)个关键字,并且以升序排列key[i]和key[i+1]之间的孩子结点的值介于key[i]、key[i+1]之间所有的叶子结点都在同一层B+树性质......
  • 后缀数据结构
    byDuck.后缀数组参考:后缀数组简介-OIWiki后缀数组(SuffixArray,SA)可以在\(\mathcal{O}(n\logn)\)的复杂度内对\(S\)的每个后缀进行字典序排序。记后缀\(i\)表示后缀\(S[i,n]\)。SA的核心在于得到两个数组\(sa,rk\)。\(sa_i\)表示字典序排名为\(i\)的后缀位......
  • 数据结构(图)
    图是一种非线性数据结构,由顶点(节点)和边组成,用于描述不同对象之间的关系。在图中,顶点表示对象,边表示对象之间的关系,可以是有向的(箭头表示方向)也可以是无向的(没有方向)。图的定义包括以下几个重要概念:顶点(Vertex):图中的节点,可以表示对象或实体。边(Edge):连接顶点的线,表示顶点之间的关......
  • 数据结构(堆)
    堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。堆的常用方法:构建优先队列支持堆排序快速找出一个集合中的最小值(或者最大值)在朋友面前装逼堆属性堆分为两种:最大堆和最小堆,两者的差别在于节点的排序方......
  • C#开发用到的数据结构
    引用:https://zhuanlan.zhihu.com/p/193997869数据结构graphLR数据结构-->线性结构-->数组线性结构-->顺序表线性结构-->链表线性结构-->栈线性结构-->队列数据结构-->非线性结构非线性结构---->树形结构树形结构-->二叉树二叉树-->二叉查找树二叉树-->红黑树树形......
  • 几种常用数据结构的C语言实现
    队列/*********************************************************************************@file:myfifo.c*@brief:先入先出队列实现*@author:huanglidi*****************************************************************......
  • 数据结构之顺序表(java语言版)
    顺序表是最简单的线性表,也就是数组。很多语言都把把它当做内置的基本数据类型,这里的数组没有对应数据结构的操作。数组是顺序存储的结构,连续分配一段内存用于存储数据。在逻辑结构和物理结构上都是连续的。顺序表建立在java内置的数组上建立顺序表。publicclassArray{ pri......