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

news/2024/7/7 23:36:27

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

相关文章

聊聊低代码技术

目录 一、什么是低代码开发&#xff1f; 二、为什么需要低代码开发&#xff0c;具备哪些优势&#xff1f; 三、低代码开发在实际工作中的作用 四、是不是有了低代码&#xff0c;就能不关注“质量”呢&#xff1f; 五、引迈旗下低代码开发平台--JNPF初体验 一、什么是低代码开发…

[黑马程序员Pandas教程]——DataFrame数据的增删改操作

目录&#xff1a; 学习目标DataFrame添加列 直接赋值添加列数据删除与去重 删除 df.drop删除行数据df.drop删除列数据数据去重 Dataframe去重Seriers去重修改DataFrame中的数据 直接修改数据replace函数替换数据按条件使用布尔值修改数据执行自定义函数修改数据 Series.apply(…

【hexo博客配置】hexo icarus主题配置

配置icarus 步骤一&#xff1a;下载icarus github网址&#xff1a;[hexo-theme-icarus](ppoffice/hexo-theme-icarus: A simple, delicate, and modern theme for the static site generator Hexo. (github.com)) 可以从这个网址上下载zip文件&#xff0c;解压后&#xff0c…

【WinForm详细教程八】WinForm中的TreeView控件

文章目录 TreeView 基本的知识属性方法事件 TreeView 案例演示案例一&#xff1a;案例二&#xff1a; TreeView 控件 用于展示分层数据&#xff0c;它以树形结构展示信息&#xff0c;每个节点可以有一个或多个子节点。TreeView 控件允许用户以可展开和可折叠的形式查看复杂的层…

二分查找常见需求(持续更新中)

1.找到tmp中大于等于target的最小下标 当然如果不存在就返回tmp.length。 public int binarySearch(int[] tmp, int target) {int l 0, r tmp.length - 1;if(tmp[r] < target) {return r 1;}while(l < r) {int mid l (r - l) / 2;if(tmp[mid] < target) {l mid…

【算法 | 模拟No.3】leetcode 38. 外观数列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

DDD领域模式的模块层级及其依赖关系

DDD领域模型设计是一种常用的软件设计模式,它强调将业务逻辑和数据模型放在最核心的位置,以便更好地满足业务需求。在DDD领域模型设计中,应用程序被分为四个层次:用户界面层、应用服务层、领域模型层和基础设施层。 层次 用户界面层(Presentation Layer) 作为用户和应…

seata1.8安装部署

1.在nacos里面创建命名空间 2.下载seata安装包 3.将下载的seata解压&#xff0c;找到seata/script/server/db目录下对应数据库的sql脚本&#xff0c;创建数据库 undo_log.sql CREATE TABLE undo_log (branch_id bigint(20) NOT NULL COMMENT branch transaction id,xid varcha…