扁平化 网站 模板/十大网站平台

扁平化 网站 模板,十大网站平台,做banner网站,网站招聘怎么做一、堆的本质与特性 1.1 什么是堆数据结构? 堆(Heap)是一种特殊的完全二叉树,它满足以下核心性质: 堆序性:每个节点的值都满足特定顺序关系 结构性:完全二叉树的结构特性(除最后一…

一、堆的本质与特性

1.1 什么是堆数据结构?

堆(Heap)是一种特殊的完全二叉树,它满足以下核心性质:

  • 堆序性:每个节点的值都满足特定顺序关系

  • 结构性:完全二叉树的结构特性(除最后一层外都是满的,最后一层节点左对齐)

这种数据结构由J.W.J. Williams在1964年提出,最初用于实现高效的堆排序算法。堆在计算机科学中的应用非常广泛,从操作系统内存管理到高级算法实现都有它的身影。

1.2 堆的两种基本类型

最大堆(Max-Heap)

  • 父节点值 ≥ 子节点值

  • 根节点是整个堆的最大值

  • 典型应用:优先队列

最小堆(Min-Heap)

  • 父节点值 ≤ 子节点值

  • 根节点是整个堆的最小值

  • 典型应用:定时任务调度

1.3 堆的底层实现方式

堆通常使用数组实现,其数组索引与树结构存在精确的数学对应关系:

数组实现的优势:

  • 内存连续,缓存友好

  • 索引计算高效(位运算优化)

  • 完全二叉树的天然适配性

二、堆的核心操作与实现

2.1 元素插入(上浮操作)

插入操作的算法步骤:

  1. 将新元素添加到数组末尾

  2. 自底向上调整堆结构(上浮)

  3. 时间复杂度:O(log n)

    void MaxHeap::insert(int key) {if (size >= capacity) {resize(2 * capacity);//扩容操作}heap[size] = key;int current = size++;// 上浮操作-大堆while (current != 0 && heap[parent(current)] < heap[current]) {//parent(current)对父亲节点的索引swap(heap[current], heap[parent(current)]);current = parent(current);}}

    2.2 元素删除(下沉操作)

    删除根节点的算法步骤:

    1. 用最后一个元素替换根节点

    2. 自顶向下调整堆结构(下沉)

    3. 时间复杂度:O(log n)

      int MaxHeap::extractMax() {if (size <= 0)return INT_MIN;if (size == 1)return heap[--size];int root = heap[0];heap[0] = heap[--size];maxHeapify(0);return root;
      }void MaxHeap::maxHeapify(int i) {//递归调用int l = left(i);//索引左孩子下标int r = right(i);//索引右孩子下标int largest = i;if (l < size && heap[l] > heap[i])largest = l;if (r < size && heap[r] > heap[largest])largest = r;if (largest != i) {swap(heap[i], heap[largest]);maxHeapify(largest);}
      }

      2.3 堆的构建

      两种建堆方式对比:

      方法时间复杂度适用场景
      连续插入法O(n log n)动态数据流
      Floyd算法O(n)静态数组初始化

      Floyd算法的实现技巧:

      void MaxHeap::buildHeap() {// 从最后一个非叶子节点开始调整int startIdx = (size/2) - 1;for (int i = startIdx; i >= 0; i--) {maxHeapify(i);}
      }

三、C/C++中的堆实现

3.1 手动实现堆结构(大堆)

#include <iostream>
#include <stdexcept>
#include <algorithm>template <typename T>
class MaxHeap {
private:T* heapArray;     // 堆存储数组int capacity;     // 数组容量int currentSize;  // 当前元素数量// 计算父节点索引inline int parent(int i) const { return (i-1) >> 1; } // 用位运算优化除法// 计算左子节点索引inline int leftChild(int i) const { return (i << 1) + 1; }// 计算右子节点索引inline int rightChild(int i) const { return (i << 1) + 2; }// 动态扩容(倍增策略)void resize() {int newCapacity = capacity == 0 ? 1 : capacity * 2;T* newArray = new T[newCapacity];// 迁移数据for (int i = 0; i < currentSize; ++i) {newArray[i] = heapArray[i];}delete[] heapArray;heapArray = newArray;capacity = newCapacity;}// 上浮操作void siftUp(int index) {while (index > 0 && heapArray[parent(index)] < heapArray[index]) {std::swap(heapArray[parent(index)], heapArray[index]);index = parent(index);}}// 下沉操作void siftDown(int index) {int maxIndex = index;int left = leftChild(index);int right = rightChild(index);// 找出三个节点中的最大值if (left < currentSize && heapArray[left] > heapArray[maxIndex]) {maxIndex = left;}if (right < currentSize && heapArray[right] > heapArray[maxIndex]) {maxIndex = right;}// 如果最大值不是当前节点,交换并递归调整if (maxIndex != index) {std::swap(heapArray[index], heapArray[maxIndex]);siftDown(maxIndex);}}public:// 构造函数explicit MaxHeap(int initialCapacity = 10) : capacity(initialCapacity), currentSize(0) {if (initialCapacity <= 0) {throw std::invalid_argument("Initial capacity must be positive");}heapArray = new T[capacity];}// 从数组构建堆(Floyd算法)MaxHeap(T arr[], int size) : currentSize(size) {capacity = size == 0 ? 1 : size;heapArray = new T[capacity];// 拷贝数据for (int i = 0; i < size; ++i) {heapArray[i] = arr[i];}// 从最后一个非叶子节点开始调整for (int i = (size/2)-1; i >= 0; --i) {siftDown(i);}}// 析构函数~MaxHeap() {delete[] heapArray;}// 插入元素void insert(T value) {if (currentSize == capacity) {resize();}heapArray[currentSize] = value;siftUp(currentSize);++currentSize;}// 提取最大值T extractMax() {if (isEmpty()) {throw std::out_of_range("Heap is empty");}T max = heapArray[0];heapArray[0] = heapArray[--currentSize];siftDown(0);return max;}// 获取最大值(不删除)T getMax() const {if (isEmpty()) {throw std::out_of_range("Heap is empty");}return heapArray[0];}// 堆是否为空bool isEmpty() const {return currentSize == 0;}// 堆排序(会破坏堆结构)static void heapSort(T arr[], int n) {// 构建最大堆for (int i = n/2 - 1; i >= 0; --i) {MaxHeap<T>::siftDown(arr, n, i);}// 逐个提取元素for (int i = n-1; i > 0; --i) {std::swap(arr[0], arr[i]);MaxHeap<T>::siftDown(arr, i, 0);}}// 打印堆内容(调试用)void print() const {std::cout << "[";for (int i = 0; i < currentSize; ++i) {std::cout << heapArray[i];if (i != currentSize-1) std::cout << ", ";}std::cout << "]" << std::endl;}private:// 静态方法用于堆排序static void siftDown(T arr[], int n, int i) {int maxIndex = i;int left = 2*i + 1;int right = 2*i + 2;if (left < n && arr[left] > arr[maxIndex]) {maxIndex = left;}if (right < n && arr[right] > arr[maxIndex]) {maxIndex = right;}if (maxIndex != i) {std::swap(arr[i], arr[maxIndex]);siftDown(arr, n, maxIndex);}}
};// 测试用例
int main() {try {// 测试1:基本插入和提取MaxHeap<int> heap;heap.insert(3);heap.insert(1);heap.insert(4);heap.insert(1);heap.insert(5);std::cout << "Test 1:" << std::endl;heap.print(); // [5, 4, 3, 1, 1]while (!heap.isEmpty()) {std::cout << heap.extractMax() << " ";} // 5 4 3 1 1std::cout << "\n\n";// 测试2:从数组构建堆int arr[] = {2,7,4,1,8,1};MaxHeap<int> heap2(arr, 6);std::cout << "Test 2:" << std::endl;heap2.print(); // [8, 7, 4, 1, 2, 1]std::cout << "Max: " << heap2.getMax() << "\n\n"; // 8// 测试3:堆排序int sortArr[] = {9,3,2,5,1,4,8};const int n = sizeof(sortArr)/sizeof(sortArr[0]);MaxHeap<int>::heapSort(sortArr, n);std::cout << "Test 3 (Heap Sort):" << std::endl;for (int i = 0; i < n; ++i) {std::cout << sortArr[i] << " "; // 1 2 3 4 5 8 9}std::cout << "\n\n";// 测试4:异常处理MaxHeap<int> emptyHeap;try {emptyHeap.extractMax();} catch (const std::exception& e) {std::cout << "Test 4 Exception: " << e.what() << std::endl;}} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;return 1;}return 0;
}

3.2 STL中的priority_queue

标准库的使用示例:

#include <queue>// 最小堆
priority_queue<int, vector<int>, greater<int>> minHeap;// 最大堆(默认)
priority_queue<int> maxHeap;// 自定义比较函数
struct Compare {bool operator()(const Person& a, const Person& b) {return a.age > b.age; // 年龄小的优先}
};
priority_queue<Person, vector<Person>, Compare> customHeap;

四、堆的高级应用

4.1 堆排序算法

实现步骤:

  1. 构建最大堆

  2. 重复提取根节点并调整堆

  3. 时间复杂度:O(n log n)

    void heapSort(int arr[], int n) {// 构建堆for (int i = n/2 - 1; i >= 0; i--)heapify(arr, n, i);// 逐个提取元素for (int i = n-1; i > 0; i--) {swap(arr[0], arr[i]);heapify(arr, i, 0);}
    }

    总结:升序建大堆,降序建小堆

4.2 海量数据Top K问题

使用堆的高效解法:

vector<int> getTopK(vector<int>& nums, int k) {priority_queue<int, vector<int>, greater<int>> minHeap;for (int num : nums) {if (minHeap.size() < k) {minHeap.push(num);} else if (num > minHeap.top()) {minHeap.pop();minHeap.push(num);}}vector<int> result;while (!minHeap.empty()) {result.push_back(minHeap.top());minHeap.pop();}return result;
}

 五、堆的工程实践要点(了解)

5.1 内存管理最佳实践

  • 动态数组扩容策略(倍增法)

  • 异常安全处理

  • 移动语义优化(C++11+)

5.2 性能优化技巧

  • 缓存友好的内存布局

  • 循环展开优化heapify

  • 预分配内存策略

  • 位运算优化索引计算

5.3 常见陷阱与调试技巧

  1. 数组越界问题

  2. 比较逻辑错误

  3. 内存泄漏检测

  4. 堆属性验证函数:

    bool isMaxHeap(int arr[], int n, int i = 0) {if (i >= n) return true;int l = 2*i + 1;int r = 2*i + 2;bool valid = true;if (l < n) valid &= (arr[i] >= arr[l]);if (r < n) valid &= (arr[i] >= arr[r]);return valid && isMaxHeap(arr, n, l) && isMaxHeap(arr, n, r);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习第十七天

Django框架-SQLite3 介绍 Django内置了对 SQLite3 数据库的支持。SQLite3 是一个轻量级的嵌入式数据库引擎&#xff0c;非常适合开发、测试和小型项目。以下是关于 Django 中 SQLite3 的介绍和应用指南。&#xff08;除了这些还支持mysql、oracle以及其他查询文档&#xff0c;…

Docker 》》Docker Compose 》》network 网络 compose

docker 默认的网络 三种模式 # 列出所有当前主机上或Swarm集群上的网络 docker network ls#查看网络详情 docker network inspect network名称# 清除未使用的docker网络 docker network prune -f# 创建网络 ocker network create -d bridge 网络名称 docker network create –s…

Python数字信号处理之最佳等波纹滤波器阶数估计原理

Matlab中的阶数估计函数 在MATLAB中&#xff0c;使用firpmord函数可以估算等波纹FIR滤波器的最小阶数。该方法基于Parks-McClellan算法&#xff0c;通过通带和阻带的频率边界、幅度响应及允许的最大误差来自动计算参数。 rp 3; % Passband ripple in dB rs 40; …

JumpServer基础功能介绍演示

堡垒机可以让运维人员通过统一的平台对设备进行维护&#xff0c;集中的进行权限的管理&#xff0c;同时也会对每个操作进行记录&#xff0c;方便后期的溯源和审查&#xff0c;JumpServer是由飞致云推出的开源堡垒机&#xff0c;通过简单的安装配置即可投入使用&#xff0c;本文…

Android LeakCanary 使用 · 原理详解

一、简介 LeakCanary 是 Square 公司开源的 Android 内存泄漏检测工具&#xff0c;通过自动化监控和堆转储分析&#xff0c;帮助开发者快速定位内存泄漏根源。其核心设计轻量高效&#xff0c;已成为 Android 开发中必备的调试工具。 二、使用方式 1. 集成步骤 在项目的 buil…

每日一题---dd爱框框(Java中输入数据过多)

dd爱框框 实例&#xff1a; 输入&#xff1a; 10 20 1 1 6 10 9 3 3 5 3 7 输出&#xff1a; 3 5 这道题要解决Java中输入的数过多时&#xff0c;时间不足的的问题。 应用这个输入模板即可解决&#xff1a; Java中输入大量数据 import java.util.*; import java.io.*;pu…

redis部署架构

一、redis多实例部署 实例1 安装目录&#xff1a;/app/6380 数据目录&#xff1a;/app/6380/data 实例2 安装目录&#xff1a;/app/6381 数据目录&#xff1a;/app/6381/data 1、创建实例安装目录 2、拷贝实例的配置文件 3、编辑实例的配置文件 第…

面试vue2开发时怎么加载编译速度(webpack)

可以输入命令获取默认 webpack 设置 vue inspect > set.js 1.使用缓存 configureWebpack: {cache: {type: filesystem, // 使用文件系统缓存类型buildDependencies: {config: [__filename] // 缓存依赖&#xff0c;例如webpack配置文件路径}}}, 2.启用 vue-loader (测试明…

深度学习-服务器训练SparseDrive过程记录

1、cuda安装 1.1 卸载安装失败的cuda 参考&#xff1a;https://blog.csdn.net/weixin_40826634/article/details/127493809 注意&#xff1a;因为/usr/local/cuda-xx.x/bin/下没有卸载脚本&#xff0c;很可能是apt安装的&#xff0c;所以通过执行下面的命令删除&#xff1a; a…

Browser Copilot 开源浏览器扩展,使用现有或定制的 AI 助手来完成日常 Web 应用程序任务。

一、软件介绍 文末提供源码和开源扩展程序下载 Browser Copilot 是一个开源浏览器扩展&#xff0c;允许您使用现有或定制的 AI 助手来帮助您完成日常 Web 应用程序任务。 目标是提供多功能的 UI 和简单的框架&#xff0c;以实现和使用越来越多的 copilots&#xff08;AI 助手&…

解锁C++:指针与数组、字符串的深度探秘

目录 一、指针与数组:亲密无间的伙伴 1.1 指针是数组的 “快捷通道” 1.2 数组名与指针:微妙的差别 1.3 动态数组:指针大显身手 二、指针与字符串:千丝万缕的联系 2.1 字符指针与 C 风格字符串 2.2 指针与 std::string 类 2.3 字符串常量与指针 三、指针在数组和字…

20250315-OpenAI-AgentSDK实验

凑热闹。可以用GLM跑。 这里暂时用GLM底座“魔鬼修改”&#xff0c;代码库仅供参考&#xff08;共同进步吧&#xff09; openai-agents-python-glm: 基于GLM底座运行SDK&#xff0c;学习实验SDK内的mAGT功能。https://gitee.com/leomk2004/openai-agents-python-glm 自言自语&a…

Qt QML实现弹球消砖块小游戏

前言 弹球消砖块游戏想必大家都玩过&#xff0c;很简单的小游戏&#xff0c;通过移动挡板反弹下落的小球&#xff0c;然后撞击砖块将其消除。本文使用QML来简单实现这个小游戏。 效果图&#xff1a; 正文 代码目录结构如下&#xff1a; 首先是小球部分&#xff0c;逻辑比较麻…

Python的那些事第四十五篇:继承自Nose的测试框架Nose2

Nose2:继承自Nose的测试框架 摘要 本文深入探讨了Nose2这一继承自Nose的测试框架。在软件开发过程中,测试是确保代码质量和稳定性的重要环节,而测试框架为测试工作的开展提供了有力支持。Nose2作为Nose的继承者,在保留Nose优势的基础上进行了诸多改进和扩展,为Python测试…

如何通过 Airbyte 将数据摄取到 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz Airbyte 是一个数据集成工具&#xff0c;可自动化并可扩展地将信息从各种来源传输到不同的目的地。它使你能够从 API、数据库和其他系统提取数据&#xff0c;并将其加载到 Elasticsearch 等平台&#xff0c;以实现高级搜索和高效分析。…

RBAC 模型的简单实现

RBAC 模型基本介绍 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;是一种广泛应用的权限管理模型。它的核心思想是通过角色来管理权限&#xff0c;而不是直接分配权限给用户。用户被赋予一个或多个角色&#xff0c;而每个角色拥有不同…

数据结构---堆栈和列

一、堆栈 1.栈堆&#xff1a;具有一定操作约束的线性表&#xff1b;&#xff08;只在一端做插入删除&#xff09; 2.栈的顺序存储结构&#xff1a; 由一个一维数组和一个记录栈顶元素位置的变量组成。定义方式如下&#xff1a; 3.入栈操作&#xff1a; 注意&#xff1a;&…

2023 年全国职业院校技能大赛(中职组)移动应用与开发赛项 赛题第十套

2023 年全国职业院校技能大赛&#xff08;中职组&#xff09;移动应用与开发赛项 赛题第十套&#xff09; 移动应用与开发赛项竞赛模块 A&#xff1a;移动应用界面设计任务 1 环保中心界面设计&#xff08;7.5 分&#xff09;任务 2&#xff1a;首页界面设计&#xff08;7.5 分…

c语言笔记 字符串函数---strcmp,strncmp,strchr,strrchr

目录 函数strcmp与strncmp 以下是错误的示范&#xff1a;两个指针字符型的指针不能直接进行比较 函数strchr与函数strrchr 函数strchr与函数strrchr与strstr函数三者对比 背景&#xff1a;如果说我们要比较两个字符串是否相等&#xff0c;使用strcmp或者strncmp函数。在c语言中…

IDEA集成git,项目的克隆,远程仓库中文件的添加删除

目录 一、克隆项目 二、使用IDEA完成文件的上传和删除 1.配置git 2.上传 3.删除&#xff08;通过git bash&#xff09; 一、克隆项目 点击克隆&#xff0c;复制url &#xff0c;如下 打开你想要克隆到哪里&#xff0c;右击&#xff0c;选择 open Git Bash here 这一步之后…