如何在10億個數中找到前1000大的數?
如何在10億個數中找到前1000大的數?
定位
TopN問題
演算法
- 排序不是最優的解決方案;
- 可以考慮分治法;
- 類似快速排序中的partition的操作,隨機選一個數t,然後對整個陣列進行partition,會得到兩部分,前一部分數都大於t,後一部分都小於t,時間複雜度O(n)。
注意點
-
10億個數載入進記憶體大概需要4G記憶體;
-
若一個機器資源有限,可採用分散式的思想,切分資料後分別計算然後彙總;
-
如果只有一臺資源有限的機器,可以使用小頂堆(每個節點都要比它的左右子節點要小);
-
從檔案中讀取出資料,遍歷一遍即可,比堆頂的資料大就替換,然後調整小
相關推薦
如何在10億個數中找到前1000大的數?
如何在10億個數中找到前1000大的數? 定位 TopN問題 演算法 排序不是最優的解決方案; 可以考慮分治法; 類似快速排序中
[面試題]海量資料處理-從10億個數中找頻率最高的1000個數
方法一:分治思想 通常比較好的方案是分治+Trie樹/hash+小頂堆(就是上面提到的最小堆),即先將資料集按照Hash方法分解成多個小資料集,然後使用Trie樹或者Hash統計每個小資料集中的que
10億個數中找出最大的10000個數(top K問題)
前兩天面試3面學長問我的這個問題(想說TEG的3個面試學長都是好和藹,希望能完成最後一面,各方面原因造成我無比想去鵝場的心已經按捺不住了),這個問題還是建立最小堆比較好一些。 先拿10000個數建堆,然後一次新增剩餘元素,如果大於堆頂的數(1
10億個數中找出最大的10000個數(top K問題)
前兩天面試3面學長問我的這個問題(想說TEG的3個面試學長都是好和藹,希望能完成最後一面,各方面原因造成我無比想去鵝場的心已經按捺不住了),這個問題還是建立最小堆
【面試必備】如何在10億數中找出前1000大的數?
作者:channingbreeze | 微信公眾號:網際網路偵察小史是一個應屆生,雖然學的是電子
利用最小堆找出10億個數中最大的10000個數
AS 如果 算法 最小值 分治 但是 空間 找出最大值 根節點 最小堆 最小堆是一種完全二叉樹,特點是根節點比兩個子節點都小(或者根節點比子節點都大) 過程 先找10000個數構建最小堆 依次遍歷10億個數,如果比最小堆的最小值大,則替換這個最小值,並重新構建最小堆 最後
100億個數中找出最大的前K個數(海量TopK問題)
對於這個問題,可以有以下思考: 給了多少記憶體儲存這100億個資料? 先思考:堆排序效率是nlogn,再思考:可以將這些資料切成等份,再從每一份中找出最大前k個數據,但是效率不高。那如果利用堆的性質呢? 小堆堆頂元素最小,先將前k個數建成小堆,那麼堆頂元素
尋找TopN——在10億資料中找到1000個最大的數
目錄 問題描述 如何從10億資料中找到前1000大的數? 解法 針對該問題,給定一個數組data,從中找出前n個最大的數。 解題思路 先維護一個具有n個數的堆,然後調整該堆為小頂堆,即每個父節點都比其子節點小。然後從剩下的陣列中逐一讀取資料,將讀取到的資料跟堆頂比較。如果
從100萬個數中找出最大的前100個數
1.演算法如下:根據快速排序劃分的思想 (1) 遞迴對所有資料分成[a,b)b(b,d]兩個區間,(b,d]區間內的數都是大於[a,b)區間內的數 (2) 對(b,d]重複(1)操作,直到最右邊的區間個數小於100個。注意[a,b)區間不用劃分 (3) 返回上
SQL中刪除前1000條資料
DELETE TABLENAME WHERE ID IN (SELECT TOP 1000 ID FR
給40億個不重複的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這40億個數中。 【騰訊】
40億佔多少個位元組:4G 10個億需要1G 一個整型需要4個位元組,40億個則需要16G 由於如果我們直接使用這種方式去儲存需要16個G顯然這是不可能的,因此我們需要用到下面的方式去儲存,採用點陣圖 我們用一個Bit位去標識一個數存在還是不存在 我們
n個數中找最大的k個數問題求解(要求複雜度為O(n))
首先我們都知道可以將n個元素建一個最(大|小)堆,O(n)。 下面一個很常見的做法就是,每步從堆頂拿掉一個元素,拿k次,就把前k個元素拿出來了。但問題是,每步拿掉一個元素之後,都需要log(n)的時間來將堆再次最(大|小)化。所以拿k次的複雜度就是 klog(n)。有沒
雜湊變形—點陣圖(給定40億個不重複的無符號數整數,沒排過序,給一個無符號整數,如何快速判斷一個數是否在這40億個數中)
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> typedef struct BitMap { size_t* _bits
大頂堆,n個數中找最小的k個數
package com.alo.offer; import java.util.Scanner; /** * n個數中找到最小的m個數 使用大頂堆 * n個書中找到最大的m個數 使用小頂堆
從十億資料中找出出現最多的數以及出現次數
package org.example.bigdata; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List
演算法實現:如何從100億個數中找到最大的10000個數
一看這個這個題目:也許你就蒙了,這麼多的數排序,直接讀入記憶體,記憶體是裝不下的,一個解決辦法:用堆排序,先取10000個數排序,排序的時間複雜度,nlogn=10000*log1000,設它為T0,那麼後面的資料依次取一個和這個堆比較,堆裡面永遠保留最大的10000個數據
判斷數字是否出現在40億個數中?
給40億個不重複的unsigned int的整數,沒排過序的,然後再給幾個數,如何快速判斷這幾個數是否在那40億個數當中? 思路: unsigned int 的取值範圍是0到2^32-1。我們可以申請連續的2^32/8=512M的記憶體,用每一個bit對應一個unsigne
通過堆排序從1億個數中找到最小的100個數
package com.my.util; import java.util.Arrays; import java.util.Date; import java.util.Random; public class Top100 { public static vo
怎樣從10億查詢詞找出出現頻率最高的10個
1. 問題描述 在大規模資料處理中,常遇到的一類問題是,在海量資料中找出出現頻率最高的前K個數,或者從海量資料中找出最大的前K個數,這類問題通常稱為“top K”問題,如:在搜尋引擎中,統計搜尋最熱門的10個查詢詞;在歌曲庫中統計下載率最高的前10首歌等等。 2. 當
在歌星大獎賽中,有10個評委為參賽的選手打分,分數為1~100分。選手最後得分為:去掉一個最高分和一個最低分後其餘8個分數的平均值。同時對評委評分進行裁判,即在10個評委中找出最公平(即評分最接返平均
#include <iostream> using namespace std; int main() {int a[10],f[10],i,k,m,n,b,c,y,p,q,d,average,h,g; cout<<"輸入十位評委按順序的打分:";