100億個整數,找出中位數
100億個整數,記憶體足夠,如何找到中位數?記憶體不足,如何找到中位數?
(1)當記憶體足夠時:
採用快排,找到第n大的數。
• 隨機選取一個數,將比它小的元素放在它左邊,比它大的元素放在右邊
• 如果它恰好在中位數的位置,那麼它就是中位數,直接返回
• 如果小於它的數超過一半,那麼中位數一定在左半邊,遞迴到左邊處理(還是第幾大)
• 否則中位數一定在右半邊,根據左半邊的元素個數計算出中位數是右半邊的第幾大(重新算第幾大),然後遞迴到右半邊處理
(2)當記憶體不足時:
分桶法
把所有數劃分到各個小區間,把每個數對映到對應的區間裡,對每個區間中數的個數進行計數,數一遍各個區間,看看中位數落在哪個區間,若夠小,使用基於記憶體的演算法,否則繼續劃分。
比如數是32位的,根據每個整數的二進位制前5位,劃分為32個桶,把數放進對應桶中。如果該桶放不下,繼續劃分,直至記憶體可以放心為止。統計每個桶中元素個數,算出中位數一定出現在哪個桶中,而且計算出是該桶中的第幾大。
相關推薦
100億個整數,找出中位數
100億個整數,記憶體足夠,如何找到中位數?記憶體不足,如何找到中位數? (1)當記憶體足夠時: 採用快排,找到第n大的數。 • 隨機選取一個數,將比它小的元素放在它左邊,比它大的元
資料結構與演算法——有1億個整數,找出最大的1000個,要求時間越短越好,空間佔用越少越好
有1億個整數,找出最大的1000個,要求時間越短越好,空間佔用越少越好(迅雷筆試) 首先要明白1億個整數佔用多大的記憶體,按每個整數4個位元組來算,用400000000B,大約400000KB,大約4
作業題:輸入4個整數,找出其中最大的數。用一個函數來實現. 分別使用結構化方法和函數嵌套的方法。
system 是否 進行 如果 div 使用 clu 函數 整型 之前在main()函數中的思路是: #include <iostream> using namespace std; int main(){ //求四個數中最大的數? /
輸出4個整數,找出其中最大的數。用函數嵌套調用來處理
函數返回值 integer return 另一個 pos 結果 圖片 個數 數值 /* p183 例7.5 輸出4個整數,找出其中最大的數。用函數嵌套調用來處理 解題思路:這個問題並不復雜,完全可以只用一個主函數就可以得到結果。在main函數中調用max4函數,max4函數
輸入n個整數,找出其中最小的K個數
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { int len=input.si
輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
解題思路: 1、最簡單方法,先排序,再取前k個,時間複雜度O(NlogN) class Solution { public: vector<int> GetLeastNumbers
編寫程式從鍵盤得到三個整數,找出其中的最大數
為了更加了解指標,此次採用指標來判斷大小 從鍵盤輸入三個整數,除了宣告外不允許出現整數型別變數 #include<stdio.h> int main(void){ int num1 = 0,num2 = 0,num3 = 0; int *p_nu
Linux-C基礎知識學習:C語言作業-輸入10個整數,找出其中最大值和最小值
Linux基礎知識學習 C語言作業:輸入10個整數,找出其中最大值和最小值 //讀10個整數存入陣列,找出其中最大值和最小值 #include <stdio.h> main(){ p
23.輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
題目:輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 import java.util.ArrayList; public
python(dict字典相關知識以及小例子:生成一個列表,存放100個隨機整數,找出出現次數最多的數字)
一、什麼是字典? #字典的使用 #子字典是一個容器類,可以用來儲存資料 #列表儲存資料特點:1、有序的 2、每一個都有一個索引,通過索引可以對資料進行查詢,修改,刪除 #字典儲存資料: key:v
布隆過濾器(Bloom Filter)(給兩個檔案,分別有100億個字串,我們只要1g的記憶體,如何找到兩個檔案的交集?分別給出精確演算法和近似演算法?)
給兩個檔案,分別有100億個字串,我們只要1g的記憶體,如何找到兩個檔案的交集?分別給出精確演算法和近似演算法? 精確演算法: 我們可以建立1000個檔案,運用雜湊函式先將檔案1的字串儲存在對應的檔案中,之後再檔案2中取元素,通過雜湊函式計算出雜湊地址
有10億個整數,要求選取重複次數最多的100個整數
(1)如果沒有記憶體限制,且假設是32位無符號的整數。最方便的辦法就是建立一個整形陣列,int hash[2^32](贊不考慮程式的虛地址空間上限),然後對這10億個數進行一次遍歷,這樣,可以得到這2^32個數各自出現的次數,再對這個hash陣列進行取第k大元素,100次後,就可以取出這出現次數最多的前100
四十個億個整數,快速判斷是否存在
oui urn file line 就是 ray ole char 十個 class Program { static void Main(string[] args) { //10
使用LINQ、Lambda 表示式 、委託快速比較兩個集合,找出需要新增、修改、刪除的物件
本文需要對C#裡的LINQ、Lambda 表示式 、委託有一定了解。 在工作中,經常遇到需要對比兩個集合的場景,如: 頁面集合資料修改,需要儲存到資料庫 全量同步上游資料到本系統資料庫 在這些場景中,需要識別出需要新增、更新、刪除的資料,由於每次應用是,需要比較的物件型別不一致,因此寫了個相對通用的方
列印1到100之內的整數,但數字中包含7的要跳過,例如:17、27、71、72,最優解
package com.itheima; /** * 第五題:編寫程式,列印1到100之內的整數,但數字中包含7的要跳過,例如:17、27、71、72 * @author Administrota
C語言,輸入abc三個整數,並從大到小排序輸出和“找出三個數中最大的數”的中間變數的用法的區別
共同點:都是中間變數,都可以重複拿來做中轉站使用 不同點:排序的題目中,中間變數只是做中轉站作兩個變數交換值用來,並不是要用來儲存最終要輸出的值 而找出最大數或者最小數的題目中,中間變數不但做交換用的中轉站,還要儲存程式最終要輸出的值
(pyhon)給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。
方法一:使用最容易理解的遍歷陣列進行查詢 def solution(nums,target): #如果列表長度小於2,則直接結束 if len(nums) < 2: return #兩次迴圈列表,分別對列表中的所有可能的數字進行相加
100億個數字中找出最大的10個
1、首先一點,對於海量資料處理,思路基本上是:必須分塊處理,然後再合併起來。 2、對於每一塊必須找出10個最大的數,因為第一塊中10個最大數中的最小的,可能比第二塊中10最大數中的最大的還要大。 3、分塊處理,再合併。也就是Google MapReduce 的基本思想。Google有很多的伺服器,每個伺服器
典型的Top K演算法 _找出一個數組裡面前K個最大數_找出1億個浮點數中最大的10000個_一個文字檔案,找出前10個經常出現的詞,但這次檔案比較長,說是上億行或十億行,總之無法一次讀入記憶體.
搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。 假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢
上億個資料儲存在硬碟中,找出最大的N個。
(1)先選N個元素組成一個小根堆,然後遍歷剩下的資料,如果第i個元素M大於小根堆的根結點,就刪除這個根結點,並將元素M插入這個小根椎,最後,小根堆中的元素就是最大的N個元素。 (2)只要開闢一個稍微大一點的緩衝區存放大於某選定值的資料即可,當緩衝滿時,重新整理選定值為緩衝區