码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【左程云算法全讲4】比较器和堆


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


    文章目录

        • 堆
        • 比较器
      • 参考博客


    😊点此到文末惊喜↩︎

    堆

    1. 完全二叉树的数组表示,当前结点下标为i(第0位不用,从而可以使用移位操作进行快速处理)
      • 左孩子: 2 ∗ i    ⟺    ( i < < 1 ) 2 * i \iff (i << 1) 2∗i⟺(i<<1)
      • 右孩子: 2 ∗ i + 1    ⟺    ( i < < 1 ∣ 1 ) 2 * i + 1 \iff (i << 1 | 1) 2∗i+1⟺(i<<1∣1)
      • 父结点: ( i ) / 2    ⟺    ( i > > 1 ) (i) / 2 \iff (i >> 1) (i)/2⟺(i>>1)
    2. 堆
      • 通过下沉和上浮操作,进行处理
    // 插入底部,插入结点自底向上上浮
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    1. 已知一个几乎有序的数组, 若把数组排好序,每个元素移动的距离一定不超过k,并且k相对与数组长度比较小
      • 将前k个数放入小根堆中,每次弹出一个堆顶元素,并将下一个数加入堆中
    在这里插入代码片
    
    • 1

    比较器

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


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

    🚩点此跳转到首行↩︎

    参考博客

    1. 对数器
    2. 单调队列
    3. 快速链表quicklist
    4. 《深入理解计算机系统》
    5. 侯捷C++全系列视频
    6. 待定引用
    7. 待定引用
    8. 待定引用
  • 相关阅读:
    【校招VIP】前端项目表达之正则表达
    ESP-01S使用AT指令连接阿里云
    基于Java纯净水商城配送系统设计与实现 开题报告
    Hexagon_V65_Programmers_Reference_Manual(23)
    【Linux】补充:进程管理之手动控制进程,以及计划任务
    Android Material Design控件使用(二)
    【Redis】Redis 的缓存使用技巧(商户查询缓存)
    CSRF漏洞
    2022年8月9日:使用 ASP.NET Core 为初学者构建 Web 应用程序--使用 HTML、CSS 和 Javascript 构建简单的网站
    【机器学习】随机种子Random Seed介绍(在Python、Pytorch、TensorFlow中的设置代码汇总)
  • 原文地址:https://blog.csdn.net/qq_43840665/article/details/134269070
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号