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.pswp.cn/diannao/38046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38046.shtml
英文地址,請注明出處:http://en.pswp.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;具有高吞吐量、低延遲、高可用性…