1. 程式人生 > >找出一個數組裡面前K個最大數

找出一個數組裡面前K個最大數

屬於前K個最大數},i=K+1, K+2, ..., N;
由於陣列A的N個元素分佈隨機,則E[Xi] = 1/N;
則依次處理其餘N - K個數的時間複雜度為T(N-K) = sum(Xi*logK),i=K+1, K+2, ..., N;
(注意logK是將一個數插入到排好序的K個數的時間複雜度)
對上式求期望,得
E[T(N-K)] = E[sum(Xi*logK),i=K+1, K+2, ..., N]
= sum(E[Xi] * logK),i=K+1, K+2, ..., N
= sum(1/n * logK),i=K+1, K+2, ..., N
= (N-K)logK/n < N-K;
綜合,該演算法平均時間複雜度為
T(N) = O(KLogK + (N - K))。

相關推薦

典型的Top K演算法_個數面前K大數

Top K 演算法詳解 應用場景:         搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。         假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢它

典型的Top K演算法 _找出一個數組裡面前K個最大數_找出1億浮點數中大的10000_一個文字檔案,找出前10經常出現的詞,但這次檔案比較長,說是上億行或十億行,總之無法次讀入記憶體.

        搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。         假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢

個數面前K大數

屬於前K個最大數},i=K+1, K+2, ..., N; 由於陣列A的N個元素分佈隨機,則E[Xi] = 1/N; 則依次處理其餘N - K個數的時間複雜度為T(N-K) = sum(Xi*logK),i=K+1, K+2, ..., N; (注意logK是將一個數插入到排好序的K個數的時間複雜度) 對上

快速個數中的兩數字,讓這兩數字之和等於一個給定的值

http 知識 繼續 進一步 repl 有一個 tails 窮舉 too 我覺得寫得很清晰,希望沒有侵犯作者的著作權,原文地址http://blog.csdn.net/hackbuteer1/article/details/6699642 快速找出一個數組中的兩個數字,讓這

php 個數中的兩數字,讓這兩數字之和等於一個給定的值

有關於php的有好幾種思路,很多部落格都有我就不一一介紹了,只是貼程式碼僅供參考。 問題:給一個一維陣列,不確定具體有多少元素,例如$arr = [1,2,3,4,3,2,1],讓他們任意兩數字相加的和等於一個給定的值,比如說 5 ,可能有好幾個兩個數相加都是5,但只是取最

程式設計師面試題:快速個數中的兩數字,讓這兩數字之和等於一個給定的值

能否快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值,為了簡化起見,我們假設這個陣列中肯定存在至少一組符合要求的解。 假如有如下的兩個陣列,如圖所示: 5,6,1,4,7,9,8 給定Sum= 10 1,5,6,7,8,9 給定Sum=

個數中子陣列和的大值

讓我們看這樣一個數組:[1, -2, 3, 4, -5, 6, -7] 很明顯,子陣列和的最大值是8,這個子陣列是[3, 4, -5, 6] 那麼我們怎麼找到最大值是多少呢? 我們假設從第一位開始對每一位加和,當加到3的時候,我們發現,之前的1+(-2)=-1,如果加上3的

Problem A: 零起點學演算法91——個數中出現次數多的那個元素

#include<stdio.h> int main() { int n,a[20],b[20]={0}; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) {

快速個數中的大數、第二大數

#include <stdio.h> int main() {         int a[] = {12, 159, 8, 1, 165, 122, 56, 99, 165};     int

LeetCode:78. Subsets(個數中所有的子集)

Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solution set must not contain dup

個數中只出現次的兩個數

//將這組資料進行排序之後相鄰兩個數進行比較,不相同則這個數只出現了一次 void sort(int arr[], int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = 0; j < n

C語言個數中重複的元素

在一個數組中的數字是連續的,但是這個陣列中有一個數重複出現了一次,找出這個數。 #include <stdio.h> int main() { int i; int tmp=10; int swap=0; int a[10]={1,3,5,

C語言實現,個數中只出現次的數

題目: 一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次,找出這兩個數字,程式設計實現。 思路: 最簡單直觀的方法,我們用兩個for迴圈,外迴圈用i,內迴圈用j表示,陣列長度用len表示,外迴圈執行一次,內迴圈執行len-1次,逐一比較,如果相等

go語言實現--個數中的兩個數,這兩個數之和等於一個給定的值

前幾天面試的時候問了我一道演算法題,題目是 :快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值所以把它記錄下來解法一:窮舉,從陣列中任意取出兩個數字,計算兩者之和是否為給定的數字,時間複雜

Two Sum(給定一個值,個數中“和”為該值的數值組合)

import java.util.HashMap; /** * Two Sum * * Given an array of integers, find two numbers such * that they add up to a specifi

電子科技大學推免複試題:利用遞迴方法個數中的大值和小值

/**************************** 編寫一個函式,使之能完成以下功能: 利用遞迴方法找出一個數組中的最大值和最小值,要求遞迴呼叫函式的格式如下: MinMaxValue(arr,n,&max,&min),其中arr是給定的陣列,n是陣

java個數中出現次數多的那個元素

方法一: import java.util.*; public class TestMain { private static HashMap<String, Integer> map; public static HashMap<Stri

個數中重複次數多的數

使用map映色表,通過引入map表來記錄每一個元素出現的次數。 bool find_most_frequency_number(int *arr, int size, int &val) { if (a == NULL || size <= 0) r

個數中只有兩數字是出現次, 其他所有數字都出現了兩次,這兩數字

題目:一個數組中只有兩個數字是出現一次, 其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。 參考程式碼: #include<stdio.h> #include <windows.h> void find_num(int arr[], int len