数据结构-堆

介绍

堆(Heap)是一种常用的数据结构,它可以在O(1)的时间复杂度内获取到最大值和最小值,同时可以在O(logN)的时间复杂度内完成插入和删除操作。堆通常被用来实现优先队列,堆中的元素按照优先级排序,优先级最高的元素总是位于堆的根节点。

堆可以分为最大堆和最小堆。在最大堆中,父节点的值总是大于或等于子节点的值;而在最小堆中,父节点的值总是小于或等于子节点的值。堆通常可以用数组来实现,通过数组的索引可以方便地获取到父节点和子节点。

在堆的操作中,插入元素时,需要将新元素放到数组的末尾,然后调整元素的位置,以保持堆的性质。删除元素时,需要将根节点删除,然后调整剩余元素的位置,以保持堆的性质。获取最大值和最小值时,只需要返回根节点的值即可。

实现举例

最小堆举例
#include <iostream>
#include <vector>
#include <stdexcept>

using namespace std;

class MinHeap {
public:
    MinHeap() {}
    ~MinHeap() {}

    void insert(int val) {
        data.push_back(val);
        int i = data.size() - 1;
        while (i > 0 && data[(i - 1) / 2] > data[i]) {
            swap(data[i], data[(i - 1) / 2]);
            i = (i - 1) / 2;
        }
    }

    int extractMin() {
        if (data.empty()) {
            throw invalid_argument("Heap is empty.");
        }
        int result = data[0];
        data[0] = data.back();
        data.pop_back();
        int i = 0;
        while (i * 2 + 1 < data.size()) {
            int left = i * 2 + 1;
            int right = i * 2 + 2;
            int minIndex = left;
            if (right < data.size() && data[right] < data[left]) {
                minIndex = right;
            }
            if (data[i] <= data[minIndex]) {
                break;
            }
            swap(data[i], data[minIndex]);
            i = minIndex;
        }
        return result;
    }

    int getMin() {
        if (data.empty()) {
            throw invalid_argument("Heap is empty.");
        }
        return data[0];
    }

private:
    vector<int> data;
};
最大堆举例
#include <iostream>
#include <vector>
#include <stdexcept>

using namespace std;

class MaxHeap {
public:
    MaxHeap() {}
    ~MaxHeap() {}

    void insert(int val) {
        data.push_back(val);
        int i = data.size() - 1;
        while (i > 0 && data[(i - 1) / 2] < data[i]) {
            swap(data[i], data[(i - 1) / 2]);
            i = (i - 1) / 2;
        }
    }

    int extractMax() {
        if (data.empty()) {
            throw invalid_argument("Heap is empty.");
        }
        int result = data[0];
        data[0] = data.back();
        data.pop_back();
        int i = 0;
        while (i * 2 + 1 < data.size()) {
            int left = i * 2 + 1;
            int right = i * 2 + 2;
            int maxIndex = left;
            if (right < data.size() && data[right] > data[left]) {
                maxIndex = right;
            }
            if (data[i] >= data[maxIndex]) {
                break;
            }
            swap(data[i], data[maxIndex]);
            i = maxIndex;
        }
        return result;
    }

    int getMax() {
        if (data.empty()) {
            throw invalid_argument("Heap is empty.");
        }
        return data[0];
    }

private:
    vector<int> data;
};

总结

堆的应用非常广泛,例如在搜索引擎中,堆可以用来实现关键词的排名;在操作系统中,堆可以用来实现内存分配;在数据挖掘中,堆可以用来实现聚类分析等。

相关推荐

  1. 数据结构-

    2023-12-06 16:06:03       43 阅读
  2. 数据结构--排序

    2023-12-06 16:06:03       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-06 16:06:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-06 16:06:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-06 16:06:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-06 16:06:03       20 阅读

热门阅读

  1. 基数排序简单了解

    2023-12-06 16:06:03       36 阅读
  2. 基于Hadoop的异构网络协同过滤推荐算法设计

    2023-12-06 16:06:03       29 阅读
  3. 可以使用京东商品详情 API 获取哪些商品信息?

    2023-12-06 16:06:03       42 阅读
  4. Gson与FastJson详解

    2023-12-06 16:06:03       33 阅读
  5. (C++20) constinit常量初始化

    2023-12-06 16:06:03       41 阅读
  6. P5706 【深基2.例8】再分肥宅水

    2023-12-06 16:06:03       44 阅读
  7. AIOps、微服务和云平台

    2023-12-06 16:06:03       36 阅读
  8. 做题笔记:SQL Sever 方式做牛客SQL的题目--VQ29

    2023-12-06 16:06:03       33 阅读
  9. 蓝桥杯官网练习题(平均)

    2023-12-06 16:06:03       40 阅读
  10. vscode配置代码片段

    2023-12-06 16:06:03       35 阅读
  11. rocketmq 集群环境部署及与spring cloud 集成

    2023-12-06 16:06:03       30 阅读
  12. RepidJson将内容写入文件简单代码示例

    2023-12-06 16:06:03       35 阅读
  13. 深度学习中的Transformer机制

    2023-12-06 16:06:03       37 阅读
  14. 封装请求头内容格式

    2023-12-06 16:06:03       37 阅读