c++ 给定一个非常巨大的数组,如何找到它的中值

快速选择算法(最优解) 

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;class Solution {
private:// 快速选择算法中的分区函数int partition(vector<int>& nums, int left, int right) {int pivot = nums[right]; // 选择最右边的元素作为枢纽元int i = left - 1; // i 指向小于等于 pivot 的元素for (int j = left; j < right; j++) {if (nums[j] <= pivot) {i++;swap(nums[i], nums[j]); // 将小于等于 pivot 的元素交换到左侧}}swap(nums[i + 1], nums[right]); // 将 pivot 放到正确的位置return i + 1; // 返回 pivot 的索引}// 快速选择算法int quickSelect(vector<int>& nums, int left, int right, int k) {if (left == right) return nums[left]; // 只有一个元素,直接返回int pivotIndex = partition(nums, left, right); // 获取 pivot 的索引if (k == pivotIndex) {return nums[k]; // 找到第 k 个最大元素} else if (k < pivotIndex) {return quickSelect(nums, left, pivotIndex - 1, k); // 在左侧继续查找} else {return quickSelect(nums, pivotIndex + 1, right, k); // 在右侧继续查找}}public:double findMedian(vector<int>& nums) {int n = nums.size();if (n % 2 == 1) {return quickSelect(nums, 0, n - 1, n / 2); // 奇数个元素,直接找到中位数} else {int left = quickSelect(nums, 0, n - 1, n / 2 - 1); // 找到第 n/2-1 个最大元素int right = quickSelect(nums, 0, n - 1, n / 2); // 找到第 n/2 个最大元素return (left + right) / 2.0; // 计算中位数}}
};int main() {vector<int> nums = {3, 2, 1, 5, 6, 4};Solution sol;double median = sol.findMedian(nums);cout << "中位数是:" << median << endl;return 0;
}

 如果数组太大,无法一次性加载到内存中,或者我们不能修改原数组,可以考虑使用基于分块的近似算法:

基于分块的近似算法(适用于超大数据集)

class Solution {
public:double findApproximateMedian(const vector<int>& nums) {const int BUCKET_SIZE = 1000;  // 可以根据实际情况调整vector<int> count(BUCKET_SIZE, 0);int minVal = INT_MAX, maxVal = INT_MIN;// 第一次遍历:找到最小值和最大值for (int num : nums) {minVal = min(minVal, num);maxVal = max(maxVal, num);}double bucketSize = (maxVal - minVal + 1.0) / BUCKET_SIZE;// 第二次遍历:统计每个桶的元素数量for (int num : nums) {int index = min((int)((num - minVal) / bucketSize), BUCKET_SIZE - 1);count[index]++;}// 找到中位数所在的桶int medianCount = (nums.size() + 1) / 2;int bucketIndex = 0;int sum = 0;while (sum < medianCount) {sum += count[bucketIndex];bucketIndex++;}bucketIndex--;// 计算近似中位数double medianLow = minVal + bucketIndex * bucketSize;double medianHigh = minVal + (bucketIndex + 1) * bucketSize;return (medianLow + medianHigh) / 2.0;}
};

这个算法的优点:

  1. 只需要两次遍历数组。
  2. 空间复杂度是O(1),因为使用了固定大小的桶。
  3. 可以处理非常大的数据集,甚至是流数据。
  4. 不需要修改原数组。

缺点是结果是近似值,不是精确的中位数。精确度可以通过增加桶的数量来提高,但会增加空间复杂度。

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

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

相关文章

逆向学习汇编篇:参数传递与返回地址的使用

本节课在线学习视频&#xff08;网盘地址&#xff0c;保存后即可免费观看&#xff09;&#xff1a; ​​https://pan.quark.cn/s/b5b046015da2​​ 在汇编语言中&#xff0c;函数调用和参数传递是编程的基础组成部分。了解如何在汇编中传递参数以及如何处理返回地址对于逆向工…

LeetCode 78. 子集

更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。 组队打卡&#xff0c;更多解法等你一起来参与哦&#xff01; LeetCode 78. 子集&#xff0c;难度中等。 迭代 解题思路&#xff1a; 初始化结果集 result&#xff0c;其中包含一个空集 []&#xff1b;遍历数…

flex讲解

随着前端技术的不断发展和更新&#xff0c;flex布局成为前端布局的主流。但是仍然有很多前端新手搞不懂flex到底怎么用&#xff01;&#xff01;&#xff01;今天我们就来好好讲讲flex布局 老规矩先上定义 什么是flex布局 布局的传统解决方案&#xff0c;基于盒状模型&#x…

郑州高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着制造业的转型升级&#xff0c;智能化、信息化已成为制造业发展的必然趋势。数字孪生技术作为智能制造领域的关键技术之一&#xff0c;它通过构建与实体系统相对应的虚拟模型&#xff0c;实现对实体系统的实时监测、预测和优化&#xff0c;为制造业的智能化、信息化提供了强…

LitelDE安装---附带每一步截图以及测试

LiteIDE LiteIDE 是一款专为Go语言开发而设计的开源、跨平台、轻量级集成开发环境&#xff08;IDE&#xff09;&#xff0c;基于 Qt 开发&#xff08;一个跨平台的 C 框架&#xff09;&#xff0c;支持 Windows、Linux 和 Mac OS X 平台。LiteIDE 的第一个版本发布于 2011 年 …

PTA-线性表实验(JAVA)

题目1&#xff1a;Josephus环的问题及算法 【实验内容】 编程实现如下功能&#xff1a; 题意说明&#xff1a;古代某法官要判决n个犯人的死刑&#xff0c;他有一条荒唐的法律&#xff0c;将犯人站成一个圆圈&#xff0c;从第start个犯人开始数起&#xff0c;每数到第distance的…

【Spring Boot AOP通知顺序】

文章目录 一、Spring Boot AOP简介二、通知顺序1. 通知类型及其顺序示例代码 2. 控制通知顺序示例代码 一、Spring Boot AOP简介 AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是对OOP&#xff08;Object-Oriented Programming&#xff0c…

使用Dockerfile构建镜像 使用docker-compose 一键部署IM项目

本文讲解&#xff1a;使用Dockerfile构建镜像 & 使用docker-compose 一键部署IM项目。 im项目地址&#xff1a;xzll-im &#xff0c;欢迎志同道合的开发者 一起 维护&#xff0c;学习&#xff0c;欢迎star &#x1f604; 1、Dockerfile编写与镜像构建&容器运行 Dockerf…

Spring Boot中使用Thymeleaf进行页面渲染

Spring Boot中使用Thymeleaf进行页面渲染 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中使用Thymeleaf模板引擎进行页面…

Nginx和CDN运用

一.Web缓存代理 1.工作机制 代替客户机向网站请求数据&#xff0c;从而可以隐藏用户的真实IP地址。将获得的网页数据&#xff08;静态Web元素&#xff09;保存到缓存中并发送给客户机&#xff0c;以便下次请求相同的数据时快速响应。 2.代理服务器的概念 代理服务器是一个位…

Kubernetes面试整理-如何监控Kubernetes集群的健康和性能?

监控 Kubernetes 集群的健康和性能是确保集群稳定运行的重要任务。以下是一些常用的方法和工具来监控 Kubernetes 集群: 1. Prometheus 和 Grafana Prometheus 是一个开源的系统监控和报警工具,Grafana 是一个开源的分析和监控平台。两者通常一起使用来监控 Kubernetes 集群。…

k8s token加新节点

在 master 节点执行 kubeadm token create --print-join-command得到token和cert&#xff0c;这两个参数在2个小时内可以重复使用&#xff0c;超过以后就得再次生成 kubeadm join apiserver.k8s.com --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha…

【入门】5分钟了解卷积神经网络CNN是什么

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、卷积神经网络的结构1.1.卷积与池化的作用2.2.全连接层的作用 二、卷积神经网络的运算2.1.卷积层的运算2.2.池化的运算2.3.全连接层运算 三、pytorch实现一个CNN例子3.1.模型的搭建3.2.CNN完整训练代码 CNN神…

【Dison夏令营 Day 04】如何用 Python 编写简单的数字猜谜游戏代码

上个周末&#xff0c;我整理了一份可以用 Python 编写的游戏列表。但为什么呢&#xff1f; 如果您是 Python 程序员初学者&#xff0c;编写有趣的游戏可以帮助您更快更好地学习 Python 语言&#xff0c;而不会被语法之类的东西所困扰。我在学习 Python 的时候曾制作过一些这样…

Hadoop-03-Hadoop集群 免密登录 超详细 3节点公网云 分发脚本 踩坑笔记 SSH免密 服务互通 集群搭建 开启ROOT

章节内容 上一节完成&#xff1a; HDFS集群XML的配置MapReduce集群XML的配置Yarn集群XML的配置统一权限DNS统一配置 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&…

短视频矩阵系统搭建APP源码开发

前言 短视频矩阵系统不仅有助于提升品牌影响力和营销效率&#xff0c;还能帮助企业更精准地触达目标受众&#xff0c;增强用户互动&#xff0c;并利用数据分析来持续优化营销策略。 一、短视频矩阵系统是什么&#xff1f; 短视频矩阵系统是一种通过多个短视频平台进行内容创作…

Vue 3 实战教程(快速入门)

Vue 3 实战教程&#xff08;快速入门&#xff09; Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;Vue 3 是 Vue 的最新版本&#xff0c;带来了许多改进和新特性。本文将通过一个简单的项目示例&#xff0c;带你快速入门 Vue 3 的基础使用。 环境设置 安装 Node.js …

多多代播24小时值守:电商直播时代是带货爆单的关键

在电商直播盛行的今天&#xff0c;直播带货已成为品牌与消费者沟通的关键。然而&#xff0c;流量波动大&#xff0c;竞争激烈&#xff0c;使品牌面临诸多挑战。因此&#xff0c;许多品牌寻求专业代播服务&#xff0c;并特别强调24小时值守的重要性。 流量来源的不稳定性是一个显…

《VUE.js 实战》读书笔记

1. 初识vue.js MVVM模式从MVC模式演化而来&#xff0c;但是MVVM模式更多应用在前端&#xff0c;MVC则是前后端共同表现。传统开发模式&#xff1a;jQuery RequireJS ( SeaJS ) artTemplate ( doT ) Gulp ( Grunt)。vue.js可以直接通过script引入方式开发&#xff0c;也可以…

Linux下安装RocketMQ:从零开始的消息中间件之旅

感谢您阅读本文&#xff0c;欢迎“一键三连”。作者定会不负众望&#xff0c;按时按量创作出更优质的内容。 ❤️ 1. 毕业设计专栏&#xff0c;毕业季咱们不慌&#xff0c;上千款毕业设计等你来选。 RocketMQ是一款分布式消息中间件&#xff0c;具有高吞吐量、低延迟、高可用性…