【C++面试刷题】快排(quick_sort)和堆排(priority_queue)的细节问题

一、快排的快速选择算法两种思路(面试会考)O(N)

快排的三数取中思路:
重要的是将它三个数进行排序最左为最小,中间为次小,最右为最大的数。(错误原因:我刚开始没有将这三个数进行排序,只是找出其最中间的值,导致时间超时了,这是因为
1、避免最坏情况:如果数组已经部分排序或完全排序,直接选择第一个数或最后一个数作为枢轴值可能会导致分割极不平衡,即一个子数组包含大部分元素,而另一个子数组只包含少数元素。这种情况会使快速排序的性能退化到O(n^2)。通过三数取中法,我们可以选择一个更居中的数作为枢轴值,从而在一定程度上避免这种不平衡的分割。
2、提高分割效率:当选择的枢轴值比较居中时,数组被分割成两个大小相近的子数组,这使得后续的递归排序过程更加高效。因为每次递归调用都需要对两个子数组进行排序,如果子数组的大小相近,则递归的深度会更小,从而减少了排序所需的总时间。
3、减少比较次数:虽然三数取中法本身需要一些额外的比较操作来确定中间数,但这些比较操作的开销相对于整个排序过程来说是微不足道的。而且,通过选择一个更好的枢轴值,我们可以减少后续分割和递归过程中的比较次数,从而提高整体排序效率。)
在这里插入图片描述
快排的随机值思想:
仅仅是随机,是概率求期望,因为是对于随机序列,存在一种称为“Linear Time Median Finding”的算法,该算法能够在最坏情况下也达到O(n)的时间复杂度。
在这里插入图片描述

二、TopK问题–用堆求前K个大/小or第K大/小的元素O(N*logK)

1、开胃小菜

思考一下,既然前K个大/小的元素,那么其实就可以用优先级队列来解决这个问题,可是,我们要注意的是面试中大概率不会说你是否会用这个优先级队列(对于一个C++程序员这个应该是基操吧!?),而大概率是考一下topk问题的这个堆是怎么整出来的,其实也就是我们数据结构中的堆(二叉树)这个部分的向上调整和向下调整建堆的过程,我们先来看一下下面这道题的具体做法(堆和快排),再来讲解一下建堆的具体过程用以我们暂时的理解应对面试。
这是题目:
在这里插入图片描述
这是答案:
在这里插入图片描述
这是解析:
我们简单思考一下这里其实我们建立的是一个小根堆,因为有个greater<int>,所以是小根堆,这里为什么要建立小根堆是因为,当我们新插入的元素比堆顶元素大的时候,那么就交换与堆顶元素,再向下调整就ok了,那么也就是每次插入的时候替换掉最小的元素呗!
而如果是 对于找前K小的元素的时候,那么就建立个大根堆即可,因为我堆顶的元素是最大的,那么当比堆顶的数小的数进来的时候就替换掉并向下调整呗!

这是快排部分:
在这里插入图片描述
这是快排部分解析:
假设我们建立的是升序,那么我们只需要判断第k大的元素是否在最右区间,也就是数量可以比较一下,不在的话就判断是否在等于区间,不在的话就判断是否在最左区间,这里的细节就是在最左区间的时候传进去的大小只有k-b-c这是因为剩下两个区间都已经判断过确实没有,到最左区间就是减去前两个区间的数量的个数。

2、正式说明堆排序的问题

要想弄清楚堆排序,那么就必须先了解建堆的过程,也就是向上调整算法和向下调整算法。

up就是孩子比父亲大就交换,迭代上去,再判断孩子比父亲大就交换。

typedef int HPDataType;
void Swap(HPDataType* p1, HPDataType* p2) 
{ HPDataType temp = *p1; *p1 = *p2; 	*p2 = temp; 
}
//向上调整(除了child,其余全是堆)
//时间复杂度:O(N*logN)
void AdjustUp(HPDataType* a, HPDataType child)
{//判断孩子和父母的关系int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);//迭代child = parent;parent = (child - 1) / 2;}else{break;}}
}

down就是因为我们前面是把大根堆的堆顶结点和新进入的值比较小的节点交换了,所以需要向下调整一下,依旧保持此时除了最后一个最大的元素以外的第二大元素当大头,只需要与孩子节点一直比较就ok了,直到孩子节点到最后一个节点了。

//向下调整
//时间复杂度:O(N)
void AdjustDown(HPDataType* a, HPDataType n, HPDataType parent)
{int child = parent * 2 + 1;while (child < n){if (child + 1 < n && a[child + 1] > a[child]){++child;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
void HeapSort(int* a, int n)
{//插入建堆//建堆 -- 向上调整//时间复杂度为O(N*logN)//升序 -- 建大堆int i = 1;for (i = 1; i < n; i++){AdjustUp(a, i);}//从后往前调整int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end;}
}

上述是一个升序的数组了,其实也就是先建立大根堆,每次把最大的哪个先选出来放到最后就好了!

结论:
在这里插入图片描述

3、附录

具体详看:
堆排序和TOP-K问题
堆(二叉树)的顺序实现

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

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

相关文章

如何认识泛基因组?从单一到多元?

近年来&#xff0c;随着多种动植物参考基因组的不断公布及同种不同个体植物基因组间的相互比较&#xff0c;人们逐渐认识到单一参考基因组不能代表物种内的多样性&#xff0c;在此基础上泛基因组概念应运而生。随着三代测序技术的发展&#xff0c;泛基因组的研究迎来了黄金发展…

Android Activity 启动模式

Standard 启动模式 页面跳转顺序 MainActivity -> StandardActivity -> StandardActivity -> StandardActivity 页面栈 示例图 任务栈中只存在MainActivity时 任务栈中存在MainActivity、StandardActivity MainActivity -> StandardActivity MainActivity…

使用freemarker实现在线展示文档功能开发,包括数据填充

首先&#xff0c;在这个独属于程序员节日的这一天&#xff0c;祝大家节日快乐【求职的能找到心仪的工作&#xff0c;已经工作的工资翻倍】。 ---------------------------------------------------------------回到正文-----------------------------------------------------…

合约门合同全生命周期管理系统:企业合同管理的数字化转型之道

合约门合同全生命周期管理系统&#xff1a;企业合同管理的数字化转型之道 1. 引言 在现代企业中&#xff0c;合同管理已经不再是简单的文件存储和审批流程&#xff0c;而是企业合规性、风险管理和业务流程的关键环节之一。随着企业规模的扩大和合同数量的增加&#xff0c;传统…

web3.0 开发实践

优质博文&#xff1a;IT-BLOG-CN 一、简介 Web3.0也称为去中心化网络&#xff0c;是对互联网未来演进的一种概念性描述。它代表着对现有互联网的下一代版本的设想和期望。Web3.0的目标是通过整合区块链技术、分布式系统和加密技术等新兴技术&#xff0c;构建一个更加去中心化…

双非本秋招成功入职小米软开

大家好&#xff0c;我是程序员阿药。最近有位同学说用了这个刷题工具&#xff0c;入职小米软开了&#xff0c;推荐给大家。 简介 微学时光是一款专为计算机专业学生和IT行业求职者设计的面试刷题小程序&#xff0c;它汇集了丰富的计算机面试题和知识点&#xff0c;旨在帮助用…

Linux CentOS7下创建SFTP服务器

本文详细介绍了在Linux CentOS上部署安全文件传输协议&#xff08;SFTP&#xff09;服务器的全过程。SFTP基于SSH&#xff08;安全壳层协议&#xff09;提供文件传输服务&#xff0c;继承了SSH的安全特性&#xff0c;如数据加密、完整性验证和服务器认证等&#xff0c;确保数据…

速来!未发表!DTW-Kmeans-Transformer-BiLSTM组合模型!时序聚类+状态识别!

速来&#xff01;未发表&#xff01;DTW-Kmeans-Transformer-BiLSTM组合模型&#xff01;时序聚类状态识别&#xff01; 目录 速来&#xff01;未发表&#xff01;DTW-Kmeans-Transformer-BiLSTM组合模型&#xff01;时序聚类状态识别&#xff01;效果一览基本介绍程序设计参考…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25 0. 前言 大语言模型在很多领域都有成功的应用&#xff0c;在本期计算机前沿技术进展研究介绍中&#xff0c;我们将带来一篇用大语言模型进行诺贝尔文学作品分析的论文。虽然有一定趁最近诺贝尔奖热潮的意味&…

【STM32 Blue Pill编程实例】-OLED显示HC-SR04超声波测距结果

OLED显示HC-SR04超声波测距结果 文章目录 OLED显示HC-SR04超声波测距结果1、HC-SR04超声波传感器介绍2、硬件准备及接线模块配置3.1 定时器配置3.2 OLED I2C接口配置3.3 HC-SR04引脚配置4、代码实现在本文中,我们将 HC-SR04 超声波传感器与 STM32 Blue Pill 开发板结合使用,并…

stm32单片机个人学习笔记12(DMA直接存储器存取)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

Java最全面试题->数据库/中间件->RocketMQ面试题

文章目录 RocketMQ多个MQ如何选型?RocketMQ组成部分有哪些?RocketMQ消费模式有几种?消息重复消费如何解决?RocketMQ如何保证消息的顺序消费?RocketMQ如何保证消息不丢失?RocketMQ如何实现分布式事务?RocketMQ的消息堆积如何处理?RocketMQ 下边是我自己整理的面试题,基…

FreeRTOS的事件组

实时嵌入式系统必须对事件做出响应。FreeRTOS允许将事件传递给任务。此类功能的示例包括信号量和队列&#xff0c;两者都具有以下属性&#xff1a; 它们允许任务在“阻塞”状态下等待单个事件发生。  当事件发生时&#xff0c;它们会取消阻塞单个任务——取消阻塞的任务是等待…

【论文阅读】Tabbed Out: Subverting the Android Custom Tab Security Model

论文链接&#xff1a;Tabbed Out: Subverting the Android Custom Tab Security Model | IEEE Conference Publication | IEEE Xplore 总览 “Tabbed Out: Subverting the Android Custom Tab Security Model” 由 Philipp Beer 等人撰写&#xff0c;发表于 2024 年 IEEE Symp…

Pulsar mq 设置延迟消息模式 pulsar mq 发送延迟消息 pulsar如何发送消费延时消息

1. 本文使用spring 提供的pulsarTemplate. 内部对于pulsar client 封装了一层 2.生产者为&#xff1a; String fingerprint UUID.randomUUID().toString();# 可修改TimeUnit 改为小时&#xff0c;天。 pulsarTemplate.newMessage(fingerprint).withTopic("dddd")…

闯关leetcode——222. Count Complete Tree Nodes

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/count-complete-tree-nodes/description/ 内容 Given the root of a complete binary tree, return the number of the nodes in the tree. According to Wikipedia, every level, except possibl…

设计模式基础概念(行为模式):责任链模式(Chain Of Responsibility)

概述 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 该模式建议你将这些处理者连成一条链。 链上的每个处理者都有一个成员变量来保存对于…

小小猫棒onu替换家用光猫,薅运营商带宽羊毛,突破1000M

小小猫棒onu 一、总体步骤 1 记录原来光猫信息 主要包括SN&#xff0c;ploam密码&#xff0c;loid、loid密码、 mac、上网的vlan id等 一般gpon采用SN、ploam密码、SNploam密码三种中的一种认证方式 一般Epon采用loid&#xff08;逻辑id&#xff09;、mac、loid mac三种中…

【Unity 实用工具篇】 | UGUI 循环列表 SuperScrollView,快速上手使用

前言 【Unity 实用工具篇】 | UGUI 循环列表 SuperScrollView&#xff0c;快速上手使用一、UGUI ScrollRect拓展插件&#xff1a;SuperScrollView1.1 介绍1.2 效果展示1.3 使用说明及下载 二、SuperScrollView 快速上手使用2.1 LoopListView22.2 LoopGridView2.3 LoopStaggered…

【Java并发编程】信号量Semaphore详解

一、简介 Semaphore&#xff08;信号量&#xff09;&#xff1a;是用来控制同时访问特定资源的线程数量&#xff0c;它通过协调各个线程&#xff0c;以保证合理的使用公共资源。 Semaphore 一般用于流量的控制&#xff0c;特别是公共资源有限的应用场景。例如数据库的连接&am…