求在100w个数中找出前100大数的算法 [问题点数:25分,结帖人Kandada1985]

Bbs1
本版专家分:0
结帖率 100%
Bbs1
本版专家分:0
Blank
红花 2009年8月 Java大版内专家分月排行榜第一
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Blank
红花 2009年8月 Java大版内专家分月排行榜第一
Gdj
Bbs1
本版专家分:0
Blank
黄花 2006年6月 PHP大版内专家分月排行榜第二
Blank
蓝花 2006年8月 PHP大版内专家分月排行榜第三
2006年7月 PHP大版内专家分月排行榜第三
2006年5月 PHP大版内专家分月排行榜第三
2005年11月 PHP大版内专家分月排行榜第三
2005年10月 PHP大版内专家分月排行榜第三
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
1000个数找出前五十大的数
public class Tree { //父节点 private int parent(int n){ return (n-1)/2; } //左孩子 private int left(int n){ return 2*n+1; } //右孩子 private int right(int n){ return 2*n+2; } //构建堆 private voi...
设计一个在一百万个数字中求十个最大的数算法
具体做法是: 构建一个只有10个元素的min-heap,那么根结点就是这10<em>个数</em>中最小的数,然后开始遍历数组,如果遇到的数比min-heap的根结点还小,直接跳过,遇到比min-heap根结点大的数,就替代根结点,然后对这个min-heap进行维护(也就是排序,保证heap的特征)。那么遍历完数组后,这个min-heap的10个元素就是最大的10<em>个数</em>。
100个数找出最大的前 100
1、根据快速排序划分的思想 ,<em>算法</em>如下: (1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 (2) 对(b,d]重复(1)操作,直到最右边的区间<em>个数</em>小于<em>100</em>个。注意[a,b)区间不用划分 (3) 返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取(b2,
Java深入---百万数据提取最大的前一百个数
package BigData; import java.io.*; import java.util.PriorityQueue; import java.util.Queue; public class FileTest { public FileTest() { } public static void main(String[] args) { // madeData();
大数据中查找最大10个数---普通查找与堆查找的比较
从一批数据中查找前10个最大值。正常的想法是构建一个10<em>个数</em>的数组,轮询查找的数据并与10<em>个数</em>中最小的比较,然后替换。 另一种思路采用大顶堆的方式。但是只用构建10次大顶堆即可。 多次运行程序后的结论: <em>100</em>000000<em>个数</em>中普通查找速度大概是18秒,而堆方式查找只有13秒,随着数据量的增大,差距会更加明显。 普通排序: [code=&quot;java&quot;] public class ...
100亿个整数,找出中位数
<em>100</em>亿个整数,内存足够,如何找到中位数?内存不足,如何找到中位数? (1)当内存足够时:采用快排,找到第n大的数。 • 随机选取一<em>个数</em>,将比它小的元素放在它左边,比它大的元素放在右边 • 如果它恰好在中位数的位置,那么它就是中位数,直接返回 • 如果小于它的数超过一半,那么中位数一定在左半边,递归到左边处理(还是第几大) • 否则中位数一定在右半边,根据左半边的元素<em>个数</em>
堆排序实现百万级数据取若干数量的最大数字(java)
      这些天看到了一道题,是一道比较出名的面试题,题目字面上比较简单。      输入若干个float数字(百万级以上) ,编写一个<em>算法</em>从中取出指定数量(<em>100</em>个以内)的最大的数字。      我们先分析一下这道题,从一堆数字里取出几个最大的数,以我们通常的思想去考虑,首先想到的是对这堆数字进行倒序排序,取出前几个就是我们要的结果,这样实现是没错的。可是注意看括号中的注释,输入的数字量级是百...
海量数据处理 - 10亿个数找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。         先拿<em>100</em>00<em>个数</em>建堆,然后一次添加剩余元素,如果大于堆顶的数(<em>100</em>00中最小的),将这<em>个数</em>替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的<em>100</em>00<em>个数</em>就是所需的最大的<em>100</em>00个。建堆
100亿数据找出最大的1000个数字(top K问题)
在大规模数据处理中,经常会遇到的一类问题:在海量数据中<em>找出</em>出现频率最好的前k<em>个数</em>,或者从海量数据中<em>找出</em>最大的前k<em>个数</em>,这类问题通常被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等。1、最容易想到的方法是将数据全部排序。该方法并不高效,因为题目的目的是寻<em>找出</em>最大的<em>100</em>00<em>个数</em>即可,而排序却是将所有的元素都排序了,做了很多的无用功。2、局部...
100亿个数找出最大的前K个数(海量数据topK问题)
分析:海量数据topK问题,在我们日常生活中应用非常广泛,比如微信的计步软件,它就是topK问题,统计出前K名,然后进行排序。那如何解决这个问题呢?我们用堆可以很好的解决这个问题。我们先用前K<em>个数</em>建立一个大堆/小堆(找最大前K<em>个数</em>用小堆,找最小前K<em>个数</em>用大堆,因为:如果找最大前K<em>个数</em>,我们建立一个大堆的话,我们需要用第N-K-1<em>个数</em>与堆顶元素比较,如果它比堆顶元素小我们就要舍弃它,但如果它比堆顶元...
面试练习题-100w个数找出最大的100个数
附、<em><em>100</em>w</em><em>个数</em>中<em>找出</em>最大的<em>100</em><em>个数</em>。 方案1:在前面的题中,我们已经提到了,用一个含<em>100</em>个元素的最小堆完成。复杂度为O(<em><em>100</em>w</em>*lg<em>100</em>)。 方案2:采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比<em>100</em>多的时候,采用传统排序<em>算法</em>排序,取前<em>100</em>个。复杂度为O(<em><em>100</em>w</em>*<em>100</em>)。 方案3:采用局部淘汰法。选取前<em>100</em>个元素,并排序,记为序列L。然后一次
100亿个数找出最大的前K个数(海量TopK问题)
对于这个问题,可以有以下思考: 给了多少内存存储这<em>100</em>亿<em>个数</em>据? 先思考:堆排序效率是nlogn,再思考:可以将这些数据切成等份,再从每一份中<em>找出</em>最大前k<em>个数</em>据,但是效率不高。那如果利用堆的性质呢? 小堆堆顶元素最小,先将前k<em>个数</em>建成小堆,那么堆顶元素就是最小的,k+1的数依次与堆顶元素进行比较,如果大于,则K+1与堆顶元素交换,依次循环直至所有数据全部比较完,那么这个堆里存放的是最大的前...
100个数中找到最大的100个数
1. <em>算法</em>如下:根据快速排序划分的思想 (1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 (2) 对(b,d]重复(1)操作,直到最右边的区间<em>个数</em>小于<em>100</em>个。注意[a,b)区间不用划分 (3) 返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取(b2,d2]区间
从一亿个数找出最大的100个 或者n个
从一亿<em>个数</em>中<em>找出</em>最大的<em>100</em>个 或者n个 用了个堆
【Top-k问题】如何从海量数据中找出前k大数
1. 问题描述 在大规模数据处理中,常遇到的一类问题是,在海量数据中<em>找出</em>出现频率最高的前K<em>个数</em>,或者从海量数据中<em>找出</em>最大的前K<em>个数</em>,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载率最高的前10首歌等等。 2. 当前解决方案 针对top k类问题,通常比较好的方案是【分治+trie树/hash+小顶堆】,即先将数据集按
数据结构与算法--从一百万个数字中得到前10大的数
 1. <em>算法</em>如下:根据快速排序划分的思想 (1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 (2) 对(b,d]重复(1)操作,直到最右边的区间<em>个数</em>小于<em>100</em>个。注意[a,b)区间不用划分 (3) 返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取(b2,d2]区...
100亿数据找出最大的1000个数
<em>100</em>亿数据<em>找出</em>最大的<em>100</em>0<em>个数</em>字
100亿个数字中找出最大的10个
<em>100</em>亿<em>个数</em>字<em>找出</em>最大的10个 1、首先一点,对于海量数据处理,思路基本上是:必须分块处理,然后再合并起来。 2、对于每一块必须<em>找出</em>10个最大的数,因为第一块中10个最<em>大数</em>中的最小的,可能比第二块中10最<em>大数</em>中的最大的还要大。 3、分块处理,再合并。也就是Google MapReduce 的基本思想。Google有很多的服务器,每个服务器又有很多的CPU,因此,<em>100</em>亿<em>个数</em>分成<em>100</em>块,
用MapReduce查找100个数中的最大值
//用MapReduce查找<em>100</em>万<em>个数</em>中的最大值 public class TopKApp {     static final String INPUT_PATH = "hdfs://chaoren:9000/input";     static final String OUT_PATH = "hdfs://chaoren:9000/out";     public static
100亿个数取出最大的10000个
题目:<em>100</em>亿个整数,求最大的1万<em>个数</em>,并说出<em>算法</em>的时间复杂度  <em>算法</em>:如果把<em>100</em>亿<em>个数</em>全部读入内存,需要<em>100</em> 0000 0000 * 4B 大约40G的内存,这显然是不现实的。  我们可以在内存中维护一个大小为<em>100</em>00的最小堆,每次从文件读一<em>个数</em>,与最小堆的堆顶元素比较,若比堆顶元素大,  则替换掉堆顶元素,然后调整堆。最后剩下的堆内元素即为最大的1万<em>个数</em>,<em>算法</em>复杂度为O(NlogN)  
100个数中找最小的10个(利用快排思想,速度可观)
主要利用了快排的思想,划分解空间。         package net.bobo; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class MinTenNumbers { //1...
在一堆很大的数中取出最小的前100个数
题目大意是:有很多很多数,
从大量数据中取得前100个最大的算法
概括: 缘起:这个月初,有同学去腾讯面试,这是最后一题,从<em>100</em>0万<em>个数</em>据中取出最大的<em>100</em>个,觉得点意思。我第一反应和同学是一样的,遍历这个<em>100</em>0万的超级数组或文件<em>100</em>次,每次<em>找出</em>当前最大的那个,并从中移除。第二反应是,显然<em>100</em>*<em>100</em>0万的规模太大,不可取,特别是,当<em>100</em>0万的数据在文件中,(如果是int型数据,32位机,将有40M,实际字段可能不止sizeof(int)),文件读取
算法2— 一亿数据获取前100个最大值
刚刚在CSDN上看到一个网友利用最小堆实现 “ 获取一亿数据获取前<em>100</em>个最大值” 。然后自己利用quicksort的原理也写了一个程序来解决那个问题。通过测试,基于quicksort原理的方法平均运行时间是1.264秒,基于最小堆方法的平均运行时间是0.288秒 (网友写的程序运行时间比我的大很多,0.288秒这个程序是我自己写的,如果测试网友写的基于minHeap的方法,运行时间是2.501秒
100亿个整数中找出最大/最小的1000个整数
一句话总结:内存无法装下,用比较速度最快的数据结构。 先找最大的<em>100</em>0个整数 1、内存无法装下:先取出<em>100</em>1个整数,构建一个最小堆,堆顶永远是最小的整数。 2、比较:从剩余的整数中一次取出一个,跟最小堆堆顶相比,如果比堆顶小,就pass掉,接着取;如果比最小堆堆顶大,那么将之替换掉堆顶,然后调整最小堆 3、结果:<em>100</em>亿个整数全部操作完后,抛开堆顶,剩下的<em>100</em>0个就是最大的<em>100</em>0个
topK问题——N个数中取最大的K个数
topK问题在海量数据中<em>找出</em>出现频率最高的前k<em>个数</em>,或者从海量数据中<em>找出</em>最大的前k<em>个数</em>,这类问题通常被称为topK问题。N<em>个数</em>中取最大的K<em>个数</em>,用小根堆;N<em>个数</em>中取最小的K<em>个数</em>,用大根堆。例题1:<em>100</em>万<em>个数</em>中,找到其中最大的<em>100</em><em>个数</em>。(N<em>个数</em>中取最大的K<em>个数</em>)思路:(1) 定义两<em>个数</em>组,arr用于存储海量数据N,top用于存储小根堆K;(2) 将海量数据的前K个元素先填满top堆;(3) 调整...
求n个数中前k大的数(排序)
            这题两种思路,一种很直接的思路就快排,另一种是堆,我们来看下这两种<em>算法</em>的区别。第一种是快排,直接用快排将n<em>个数</em>排成有序,然后将前k大的数输出。平均时间复杂度为O(nlogn),空间复杂度为O(logn)。代码献上:public static void quickSort(int arr[],int k) {    Arrays.sort(arr);      for(int...
算法设计:从一个很大很大的数组里找前N个最大数的思路之一
这里先讲一种类似于快速排序的方法。注意题目要求,不要求完全排序,只要求最快解决问题!这个题是我面试NI公司时,对方问我的。原话是从1亿<em>个数</em>据里,<em>找出</em>前一百个最大的。 首先看源码吧: void main(int a[], int start, int end, int N)//从数组a里,<em>找出</em>前N个最大的。如果是a[<em>100</em>],则start = 0, end = 99.注意这个索 引问题
10亿个数找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。 先拿<em>100</em>00<em>个数</em>建堆,然后一次添加剩余元素,如果大于堆顶的数(<em>100</em>00中最小的),将这<em>个数</em>替换堆顶,并调整结构使之仍然...
【海量数据处理】N个数找出最大的前K个数
N<em>个数</em>中<em>找出</em>最大的前K<em>个数</em>,需要用小堆实现。分析:由于小堆的堆顶存放堆中最小的数据,可以通过与堆顶数据进行比较,将<em>大数</em>据存放在堆中,注意在每次改变堆顶数据后,进行调堆,使堆顶一直存放整个堆中最小元素。void AdjustDown(int *a, size_t root, size_t size)//下调 {//小堆 size_t parent = root; size_t child = p
找出数组前N大的数
这个题也是个比较有名的面试题.当然有很多变种.   题目意思基本是:从一<em>个数</em>据量很大的数组里找前N大的元素.不允许排序.   这个题有两个比较好的思路:   思路一:用快速排序的思想,是思想,不是要排序;   思路二:用最大堆的思想.      我暂时只实现了思路一,思路二我之后实现了会补上.      思路一比较简单了.我们先用快排的思想<em>找出</em>第n大
求n个数中前m个大的数的堆排序版本
堆排序就是先求出最大的数,然后求出次大的数,然后求出第三大的数,依次类推,而这个题只要求求出前m个大的数,所以用堆排序应该是效率比较高的。   heapsort() { build_max_heap(int n); //建立最大堆 for (i=n;i&amp;gt;=2;i--) { exchange(a[1]...
求数组中的第三大数
Title //用sort方法求数组的第三大值 var arr=[3,2,5,8,4,7,6,9]; function sortNumber(a,b) { return b-a; } console.log('第三大得数:'+arr.sort(sortNumber)[2]);
通过堆排序从1亿个数中找到最小的100个数
package com.my.util; import java.util.Arrays; import java.util.Date; import java.util.Random; public class Top<em>100</em> { public static void main(String[] args) { find(); } public static void find(
三种方法寻找数组前K个最大的数
package com.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; //给定一个长度为n的数组,寻找其中最大的k<em>个数</em> public class FindKthElements { //<em>算法</em>一:排序,时间复杂度O(nlogn),空间复杂度O(1) public Arr...
10亿个数找出最大的10000个数之top K问题
    方法一、先拿<em>100</em>00<em>个数</em>建堆,然后一次添加剩余元素,如果大于堆顶的数(<em>100</em>00中最小的),将这<em>个数</em>替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的<em>100</em>00<em>个数</em>就是所需的最大的<em>100</em>00个。建堆时间复杂度是O(mlogm),<em>算法</em>的时间复杂度为O(nmlogm)(n为10亿,m为<em>100</em>00)。    方法二(优化的方法):可以把所有10亿<em>个数</em>据分组存放,比如分别放在<em>100</em>...
10亿数中找出最大1000个数算法C实现(简化版)
此处主要采用堆排序来实现。 typedef int ElementType; typedef struct { ElementType *r; int length; }SqList; #define N 20 #define M 10 void Heap
算法题--大数据取最大前几个
10亿个整数,随机生成,可重复,求最大的前1万个。当时我一下子就蒙了,没反应过来,何况我还正在烧着菜呢,所以我就没细想,说了一个连我都鄙视我的思路:我说导入数据库,然后用select语句选出最大的前1万个。可能我的答案连面试官都无语了,所以他就没再往下问了,不过他还是通知我明天16号早上去腾讯大厦笔试,由于我明天没空,就推迟到了17号早上10点。至此,整个电话面试就结束了。过后,我想了想,10亿个
快速找出个数组中的最大数、第二大数
#include int main() { int i,max,second; int a[10]; for(i=0;i<a[i]) second=max; max=
hadoop算法(100个数字取最大值)
Map import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class MyMapper extends Ma
c++海量数据查找前10个最小的数__2018.06.02
1#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; #include&amp;lt;queue&amp;gt; #include&amp;lt;time.h&amp;gt; using namespace std; int main() { srand(time(0)); priority_queue&amp;lt;int&amp;gt; MyIntPriority_Queue; vec...
一亿数据获取最大值的前100
两种思路: 1. 根据快速排序划分的思想  a. 假设数组为 array[N] (N = 1 亿),首先利用quicksort的原理把array分成两个部分,左边部分比 array[N - 1] (array中的最后一个值,即pivot) 大, 右边部分比pivot 小。然后,可以得到 array[array.length - 1] (即 pivot) 在整<em>个数</em>组中的位置,假设是 k.
面试题-100个数据前100大的数据
先取出前<em>100</em><em>个数</em>,维护一个<em>100</em><em>个数</em>的最小堆,遍历一遍剩余的元素,在此过程中维护堆就可以了。具体步骤如下: step1:取前m个元素(例如m=<em>100</em>),建立一个小顶堆。保持一个小顶堆得性质的步骤,运行时间为O(lgm);建立一个小顶堆运行时间为m*O(lgm)=O(m lgm); step2:顺序读取后续元素,直到结束。每次读取一个元素,如果该元素比堆顶元素小,直接丢弃 如果大于堆顶元素,则用该元
查找1亿个数里面最大的100个数
#include #include #include #include #include #include #include using namespace std; int main() { vector a(<em>100</em>000000,0); srand((int)time(0)); for(int i=0;i<<em>100</em>000000;i++) {
100000个数找出最小或最大的10个
大体思路: 首先一点,对于海量数据处理,思路基本上是确定的,必须分块处理,然后再合并起来。 对于每一块必须<em>找出</em>10个最大的数,因为第一块中10个最<em>大数</em>中的最小的,可能比第二块中10最<em>大数</em>中的最大的还要大。 分块处理,再合并。也就是Google MapReduce 的基本思想。Google有很多的服务器,每个服务器又有很多的CPU,因此,<em>100</em>亿<em>个数</em>分成<em>100</em>块,每个服务器处理一块,1亿<em>个数</em>分成...
大数据数组查找最大的100个数
如果数组是<em>大数</em>据,比如几千万数据中寻找前<em>100</em>个最<em>大数</em>据? 这使我们可以借助堆排序。我们可以用最小堆来解决,由于堆顶是最小元素,如果遍历一个元素比之大,则替换,然后下滤调整堆,由于堆得调整时间复杂度为O(lgN),所以执行效率还是很快的。
算法实现:如何从100亿个数中找到最大的10000个数
一看这个这个题目:也许你就蒙了,这么多的数排序,直接读入内存,内存是装不下的,一个解决办法:用堆排序,先取<em>100</em>00<em>个数</em>排序,排序的时间复杂度,nlogn=<em>100</em>00*log<em>100</em>0,设它为T0,那么后面的数据依次取一个和这个堆比较,堆里面永远保留最大的<em>100</em>00<em>个数</em>据,最后就输出这<em>100</em>00w<em>个数</em>据,不知道还有什么好的办法吗?
100W个数中最快找出两个相同的数
#include #include #include using namespace std; /* * 从<em>100</em>W<em>个数</em>中最快<em>找出</em>两个相同的数 */ // 从set容器中查找 void method1() { // windows下栈空间只有2M,所以得在heap下 int * arr = new int[<em>100</em>0000]; for( in
算法导论》学习之关于如何利用排序算法,从1亿个数中,选出最大(小)的100个数
首先声明:本文内容是参考别人的博客,链接为:http://blog.csdn.net/beiyeqingteng/article/details/7534489 前言: 刚刚在CSDN上看到一个网友利用最小堆实现 “ 获取一亿数据获取前<em>100</em>个最大值” 。原帖请看:http://blog.csdn.net/yjflinchong/article/details/7533972。
100亿个数找出最大的10个
1、首先一点,对于海量数据处理,思路基本上是确定的,必须分块处理,然后再合并起来。 2、对于每一块必须<em>找出</em>10个最大的数,因为第一块中10个最<em>大数</em>中的最小的,可能比第二块中10最<em>大数</em>中的最大的还要大。 3、分块处理,再合并。也就是Google MapReduce 的基本思想。Google有很多的服务器,每个服务器又有很多的CPU,因此,<em>100</em>亿<em>个数</em>分成<em>100</em>块,每个服务器处理一块,1亿...
随机生成20个数找出最中间的那个数
package com.wang.test; import java.util.Random; public class Test3 { public static void main(String[] args) { Random r = new Random(); int[] arr = new int[20]; System.out.println("生成的20个随机数是
C语言:找出第二大数......前几个数相等的情况也考虑了
#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;string.h&amp;gt; int main() {     int a[] = { <em>100</em>,<em>100</em>,32,45,21,67,32,68,41,99,13,71 };         int max = 0;      int smax = 0;     int i = 0; ...
海量数据中找到最大的100个数Java版
//维持一个容量为<em>100</em>的小顶堆 public static int[] getTheMaxNums(int[] a){ int[] result = new int[<em>100</em>]; for(int i = 0;i&amp;lt;<em>100</em>;i++){ result[i] = a[i]; } int len = result.length; for(int...
求n个数中第k大的数、快速排序
求n<em>个数</em>中第k大的数、快速排序 分类: 数据结构和<em>算法</em> 2011-05-29 15:45 41人阅读 评论(0) 收藏 举报 求n<em>个数</em>中第k大的数 view plain #include   #include   /**  *求一<em>个数</em>
分治法找出数组中第二大数
#include using namespace std; class Res { public: int max; int secmax; }; Res maxnum(int *a,int first,int last) { int mid; Res res; if (last-first==1) { if (a[first] > a[last]) { res.max = a[first
算法设计:如何求数组中第2大的数
一种思路是利用两次冒泡法,因为第一次冒泡,最大的在a[n-1],第二次冒泡后,次最大值在a[n-2]这样直接返回即可。核心代码如下: for(int i=0; ia[j+1]) swap(a[j], a[j+1]); } return a[n-2]; 但是这样做,显然效率不够高,几乎
算法与数据结构】在n个数中取第k大的数(基础篇)
(转载请注明出处:http://blog.csdn.net/buptgshengod) 题目介绍           在n<em>个数</em>中取第k大的数(基础篇),之所以叫基础篇是因为还有很多更高级的<em>算法</em>,这些以后再讨论。本文用两种最基本的方法来解决这个问题。使用java语言描述。例子是十<em>个数</em>中取第三大的。 <em>算法</em>一              用冒泡法将n<em>个数</em>从大到小排序,再取第k大。 publi
[基础题]1.快速找出个数组中的最大数、第二大数
[基础题]1.快速<em>找出</em>一<em>个数</em>组中的最<em>大数</em>、第二<em>大数</em>。
算法)从10000个数找出最大的10个
从<em>100</em>00个整数中<em>找出</em>最大的10个,最好的<em>算法</em>是什么? <em>算法</em>一:冒泡排序法   千里之行,始于足下。我们先不说最好,甚至不说好。我们只问,如何“从<em>100</em>00个整数中<em>找出</em>最大的10个”?我最先想到的是用冒泡排序的办法:我们从头到尾走10趟,自然会把最大的10<em>个数</em>找到。方法简单,就不再这里写代码了。这个<em>算法</em>的复杂度是10N(N=<em>100</em>00)。 <em>算法</em>二:   有没有更好一点的算
java实现小顶堆 在指定数据中找出前n大的数
小顶堆:       我们利用的特性:每个节点都比左右孩子小       图示:       取数组前n<em>个数</em>,构成小顶堆      然后从数组里面获取数据,如果比堆顶小,直接抛弃,如果比堆顶大,就替换堆顶,并调整堆,使堆始终满足小顶堆的特性     93比18大,替换18     调整堆 然后依次处理下一<em>个数</em>44 对数组内的数调整完成后,前n个大的数 就在小顶堆...
在存有10亿个数的文件中找到最大的100个数
这是《编程珠玑》中的一道题目。10亿个整数,假设每个整数需要四个字节,如果使用排序的话,需要大约4G的内存,现在的很多pc都没有多这么内存,更不用说作者那个年代。 我们借助最小堆来解决这个问题。 主要步骤: 一、使用一个大小为一百万零一的整数数组来构建堆(堆的下标从1开始) 二、从文件中读取前一百万<em>个数</em>,每读入一<em>个数</em>,调用函数,保持其最小堆的性质,堆的根永远是堆中最小的元素。 三、从一百
不用排序找出第二大的数
int fun1(int Array[],int len) { int i = 0; int Max = 0; int mini = 0; while (i Max) { mini = Max; Max = Array[i]; } else { if (mini < Array[i]) mini =
有一个100万的数组,里边有两个是重复的,如何设计算法找到
输出:两个重复的元素的索引 首先,直接两重循环查找不是不行,估计是最蠢的做法了。 其次,先用快速排序拍一遍,然后遍历,时间复杂度最好的情况是最坏的情况是nlogn+n 有人说是用hash,有人说用位图,不知道什么情况,用起来估计很麻烦。 其实最好想的一个方式为HashSet方式,在数量不那么大的情况下没问题的,<em>100</em>万同时加载到内存中可以接受,主要考虑时间复杂度。 代码如下:
典型的Top K算法_找出个数组里面前K个最大数
原文 典型的Top K<em>算法</em>_<em>找出</em>一<em>个数</em>组里面前K个最<em>大数</em>...或<em>找出</em>1亿个浮点数中最大的<em>100</em>00个...一个文本文件,<em>找出</em>前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,问最优解...     Top K <em>算法</em>详解 应用场景:         搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为
海量数据中找出前k大数(topk问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。         先拿<em>100</em>00<em>个数</em>建堆,然后一次添加剩余元素,如果大于堆顶的数(<em>100</em>00中最小的),将这<em>个数</em>替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的<em>100</em>00<em>个数</em>就是所需的最大的<em>100</em>00个。
海量数据处理:有1亿个浮点数,找出其中最大的10000个
第一种方法是将数据全部排序,然后在排序后的集合中进行查找,最快的排序<em>算法</em>的时间复杂度一般为O(nlogn),例如快速排序.而在32位机器上,每个float类型占4B,1亿个浮点数就要占用400M的存储空间,对于一些可以内存小于400MB的计算机而言,显然是不能一次将全部数据读入内存进行排序的.其实即使内存能满足要求,该方法也不高效,因为题目的目的是寻<em>找出</em>最大的<em>100</em>00<em>个数</em>即可,而排序是将所有元素...
求N个数中前k个大的数
解题思路:一般思路就是将N<em>个数</em>排序后,取前k<em>个数</em>就ok。但是如果N<em>个数</em>是几十亿<em>个数</em>,加载不到内存怎么办?这时候就需要利用堆来解决这个问题具体的思路是:先建一个k<em>个数</em>的小堆,然后从k+1<em>个数</em>往后的值与堆顶元素比较,若此数比堆顶元素大,就将堆顶元素用这<em>个数</em>替换,然后重新调整堆,以此向后重复上述过程,直到将N<em>个数</em>比较完成,那么此时组成这个堆的k个元素就是前k个大的数。接下来我们讲一下最小堆与最大对堆的思...
百万以内素数快速查找
/** * 初级版本 */ @Test public void prime() { long date = System.currentTimeMillis(); System.out.println(date); for (int i = 1; i <= i; j++) { if (i
一亿个数字中找到前K个最大的数
(面试遇到了这个问题)基本:    先构造K<em>个数</em>的最小堆;    然后遍历一亿<em>个数</em>,每次和堆中最小数进行比较,如果更大则往堆中插入该数;升级:    采用分治的办法,使用将一亿<em>个数</em>分成N份,然后采用多线程或者多台服务器,分别得到N份最大K个最大的数;       然后对N*K<em>个数</em>求最大的K<em>个数</em>。...
面试题:从n个数中选出前k大的数
从n<em>个数</em>中选出前k大的数 1.使用冒泡或者选择排序 kn 2.使用大根堆排序或者快速排序 nlgn 3.使用计数排序(数组分布在一个很小的区间时)或者基数排序或者桶排序 n 4.维护一个长度为k的有序数组,或者容量为k的小根堆 klgk+(n-k)lgk = nlgk 5.使用快排思路 一直取一<em>个数</em>划分 直到左边的数量大于k为止 n+n/2+... = 2n
有 n 个无序整数( n>10000), 则找出其中最大的 M 个数字( 5<10), 所需要的最小时间复杂度为:
创建一个大小为M的容器来存储最小的M<em>个数</em>字。每次读入一<em>个数</em>字x,如果容器未满,则直接把x放入容器之中;如果容器已满,则<em>找出</em>容器中最大的数字MAX,如果x小于MAX,则用x替换MAX,否则抛弃x。 总结一下所有可能的容器操作就是:(1)找到M<em>个数</em>字中的最大值;(2)删除最<em>大数</em>;(3)插入一个新数字。可以用二叉树来实现这个容器,这3个操作可以在O(logM)时间内完成。所以总的时间复杂度就是O(
vbAPI应用实例100(1)下载
vbAPI应用实例100(1) vbAPI应用实例100(1) vbAPI应用实例100(1) vbAPI应用实例100(1) vbAPI应用实例100(1) 相关下载链接:[url=//download.csdn.net/download/lzwml/1986948?utm_source=bbsseo]//download.csdn.net/download/lzwml/1986948?utm_source=bbsseo[/url]
AD620简介(英文版)下载
对AD620的参数,波形,频率等进行分析与比较。并且介绍了其用途及作用等等。 相关下载链接:[url=//download.csdn.net/download/sq_ice/2008999?utm_source=bbsseo]//download.csdn.net/download/sq_ice/2008999?utm_source=bbsseo[/url]
Oracle数据库维护培训--华为资料下载
Oracle数据库维护培训--华为的经典教程 相关下载链接:[url=//download.csdn.net/download/luxiaoyu_sdc/2025577?utm_source=bbsseo]//download.csdn.net/download/luxiaoyu_sdc/2025577?utm_source=bbsseo[/url]
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 大数据机器学习找出 深度学习大数据预测
我们是很有底线的