当前位置: 首页 > news >正文

【左程云算法全讲4】比较器和堆

系列综述:
💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
🤭结语:如果有帮到你的地方,就点个赞关注一下呗,谢谢🎈🎄🌷!!!
🌈【C++】秋招&实习面经汇总篇


文章目录

      • 比较器
    • 参考博客


😊点此到文末惊喜↩︎

  1. 完全二叉树的数组表示,当前结点下标为i(第0位不用,从而可以使用移位操作进行快速处理)
    • 左孩子: 2 ∗ i ⟺ ( i < < 1 ) 2 * i \iff (i << 1) 2i(i<<1)
    • 右孩子: 2 ∗ i + 1 ⟺ ( i < < 1 ∣ 1 ) 2 * i + 1 \iff (i << 1 | 1) 2i+1(i<<1∣1)
    • 父结点: ( i ) / 2 ⟺ ( i > > 1 ) (i) / 2 \iff (i >> 1) (i)/2(i>>1)
    • 通过下沉和上浮操作,进行处理
// 插入底部,插入结点自底向上上浮
void HeapUp(vector<int> &vec, int index) {// 若当前结点大于父亲结点,则交换while (vec[index] > vec[(index - 1) / 2]) {swap(vec[index], vec[(index - 1) / 2]);index = (index-1) / 2;}
}// 弹出根节点,插入结点自顶向下下沉
void HeapDown(vector<int> &vec, int index, int heap_size) {int left = index * 2 + 1;while (left < heap_size) {	// 表示孩子,即至少有一个左孩子// 有右孩子 && 右孩子值大于左孩子 则最大下标为右孩子,否则是左孩子int largest = left + 1 < heap_size && vec[left+1] > vec[left] ? left+1 : left;// largest中存储自己和左右孩子中最大的largest = vec[largest] > vec[index] ? largest : index;if (largest == index) break;	// 如果是根结点则停止swap(vec[largest], vec[index]);// 迭代条件index = largest;left = index * 2 + 1;}
}
// 堆排序
void HeapSort(vector<int> vec) {if (vec.empty() || vec.size() < 2) return ;// 依次将每个数插入,建立大根堆for (int i = 0; i < vec.size(); ++i) {HeapUp(vec, i);}// 每次将大根堆的堆顶元素与数组尾元素交换int heap_size = vec.size();swap(vec[0], vec[--heap_size]);while (heap_size > 0) {HeapDown(vec[0], vec[head_size]);swap(vec[0], vec[--heap_size]);}
}
  1. 已知一个几乎有序的数组, 若把数组排好序,每个元素移动的距离一定不超过k,并且k相对与数组长度比较小
    • 将前k个数放入小根堆中,每次弹出一个堆顶元素,并将下一个数加入堆中
在这里插入代码片

比较器

  1. 比较器
    • 原理:通过重载比较运算符,然后进行两个元素的按某种条件的大小比较
    • 优点:可用于泛型编程
  2. 自定义cmp函数,传入堆中,从而实现自定义的比较


少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
不如点赞·收藏·关注一波

🚩点此跳转到首行↩︎

参考博客

  1. 对数器
  2. 单调队列
  3. 快速链表quicklist
  4. 《深入理解计算机系统》
  5. 侯捷C++全系列视频
  6. 待定引用
  7. 待定引用
  8. 待定引用
http://www.lryc.cn/news/221239.html

相关文章:

  • 【计算机组成与设计】Chisel取指和指令译码设计
  • 「Verilog学习笔记」位拆分与运算
  • protobufjs实现protobuf序列化与反序列化
  • el-select多选以tag展示时,超过显示长度以...省略号显示,且在一行展示
  • 计算机网络第4章-通用转发和SDN
  • DDD技术方案落地实践 | 京东云技术团队
  • MySQL 案例:update set 和 and 的坑
  • VSCode remote-ssh 连接远端服务器失败
  • 通达信动量线MTM指标原理详解及MTM底背离选股公式
  • 汇编-DUP操作符
  • 2311C++抽象工厂
  • Lavarel定时任务的使用
  • Java开发者的网络安全指南(二)
  • Python基础学习016__UnitTest
  • 一物一码需求,标签制作功能轻松解决
  • 【Linux】七、基础IO
  • Elasticsearch语法之Term query不区分大小写
  • 远程管理SSH服务
  • Linux 实现原理 — NUMA 多核架构中的多线程调度开销与性能优化
  • Oracle锁处理
  • 持续集成交付CICD:安装Jenkins Slave(从节点)
  • Dart(一):Dart入门
  • [动态规划] (十一) 简单多状态 LeetCode 面试题17.16.按摩师 和 198.打家劫舍
  • 【EI会议投稿】第三届计算机、人工智能与控制工程国际学术会议 (CAICE 2024)
  • python 之 列表推导式
  • 【左程云算法全讲2】链表、栈、队列、递归、哈希表和有序表
  • SQL第三次上机作业
  • 前端事件案例补充
  • 3.8 Android eBPF HelloWorld调试(二)
  • xss如何快速提取cookies