一个较好的方法:先拿出10000个建立小根堆,对于剩下的元素,如果大于堆顶元素的值,删除堆顶元素,再进行插入操作,否则直接跳过,这样知道所有元素遍历完,堆中的10000个就是最大的10000个。时间复杂度: m + (n-1)logm = O(nlogm) 优化的方法:可以把所有10亿个数据分组 ...
从 个整数中找出最大的 个,最好的算法是什么 算法一:冒泡排序法 千里之行,始于足下。我们先不说最好,甚至不说好。我们只问,如何 从 个整数中找出最大的 个 我最先想到的是用冒泡排序的办法:我们从头到尾走 趟,自然会把最大的 个数找到。方法简单,就不再这里写代码了。这个算法的复杂度是 N N 。 算法二: 有没有更好一点的算法呢 当然。维持一个长度为 的降序数组,每一个从数组拿到的数字都与这个降 ...
2013-03-20 21:10 10 19235 推荐指数:
一个较好的方法:先拿出10000个建立小根堆,对于剩下的元素,如果大于堆顶元素的值,删除堆顶元素,再进行插入操作,否则直接跳过,这样知道所有元素遍历完,堆中的10000个就是最大的10000个。时间复杂度: m + (n-1)logm = O(nlogm) 优化的方法:可以把所有10亿个数据分组 ...
,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆时间复 ...
最小堆 最小堆是一种完全二叉树,特点是根节点比两个子节点都小(或者根节点比子节点都大) 过程 先找10000个数构建最小堆 依次遍历10亿个数,如果比最小堆的最小值大,则替换这个最小值,并重新构建最小堆 最后输入10000个值 时间复杂度 构建最小堆的复杂度为 logn ...
1. 算法如下:根据快速排序划分的思想 (1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 (2) 对(b,d]重复(1)操作,直到最右边的区间个数小于100个。注意[a,b)区间不用划分 (3) 返回上一个区间,并返回此区间的数字 ...
1、首先一点,对于海量数据处理,思路基本上是确定的,必须分块处理,然后再合并起来。 2、对于每一块必须找出10个最大的数,因为第一块中10个最大数中的最小的,可能比第二块中10最大数中的最大的还要大。 3、分块处理,再合并。也就是Google MapReduce 的基本思想。Google ...
采用小顶堆 ...
描叙:一大堆数据里面,数字与数字之间用空格隔开,找出出现次数最多的一个数字的算法 #include<stdio.h> void FindMostTimesDigit(int *Src , int SrcLen) { int element , has = SrcLen ...
问题定义:有2n+1个数,只有一个单着,别的都是成对的,找出这个单着的数。比如:2 1 3 2 1。3是答案。 思路一:暴力搜索——每个数都和其他数比较,找不到相同的,就得到了结果。时间复杂度为o(n2) 思路二:排序搜索——先给序列排个序,之后从前往后一对一对的找,直到不是成对的为止 ...