假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」
2017-01-13 17:28
441 查看
假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」,然后将每段的数据进行乱序(即:段内数据乱序),形成一个新数组。请写一个算法,将所有数据从小到大进行排序,并说明时间复杂度。
涉及大数据处理:需要将数据hash若干小文件中,然后对各文件的数据进行排序,最后再进行堆排序或归并。
#include <iostream>
#include <vector>
using namespace std;
#define N 6
#define M 3
void millionSort(int* myints, int len) {
for (int i = 0; i <= len - M; ++i) {
/*每次将后面一个元素加入堆中并保持最小堆
* 注意: 可以不用每次都重建最小堆,到最后在重建最小堆即可
* 只需保持最小堆原因:N-M个元素都会成为堆顶,若不是在最小堆则会重建,
* 后面M个元素不一定满足最小堆,需重建
* less<int>()为构造最大堆,greater<int>()为构造最小堆(默认大堆)
* */
make_heap(myints + i, myints + i + M, greater<int>());
// sort_heap(myints + i, myints + i + M + 1);
}
//后面M个元素不一定满足最小堆,需重建
/*sort_heap时,必须先是一个堆
*(两个特性:1、最大元素在第一个 2、添加或者删除元素以对数时间),
* 因此必须先做一次make_heap*/
make_heap(myints + len - M, myints + len);
sort_heap(myints + len - M, myints + len); //升序
}
涉及大数据处理:需要将数据hash若干小文件中,然后对各文件的数据进行排序,最后再进行堆排序或归并。
#include <iostream>
#include <vector>
using namespace std;
#define N 6
#define M 3
void millionSort(int* myints, int len) {
for (int i = 0; i <= len - M; ++i) {
/*每次将后面一个元素加入堆中并保持最小堆
* 注意: 可以不用每次都重建最小堆,到最后在重建最小堆即可
* 只需保持最小堆原因:N-M个元素都会成为堆顶,若不是在最小堆则会重建,
* 后面M个元素不一定满足最小堆,需重建
* less<int>()为构造最大堆,greater<int>()为构造最小堆(默认大堆)
* */
make_heap(myints + i, myints + i + M, greater<int>());
// sort_heap(myints + i, myints + i + M + 1);
}
//后面M个元素不一定满足最小堆,需重建
/*sort_heap时,必须先是一个堆
*(两个特性:1、最大元素在第一个 2、添加或者删除元素以对数时间),
* 因此必须先做一次make_heap*/
make_heap(myints + len - M, myints + len);
sort_heap(myints + len - M, myints + len); //升序
}
相关文章推荐
- 假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」
- 程序员面试金典——解题总结: 9.18高难度题 18.3编写一个方法,从大小为n的数组中随机选出m个整数。要求每个元素被选中的概率相同。
- 一个数组arr,长度为N,N小于10^8,里面数字的范围是1~N,求每个数字出现的次数
- 给定一个整数数组,两个数字的返回索引将它们加到一个特定的目标中。 您可以假设每个输入都只有一个解决方案,并且您可能不会两次使用相同的元素。
- 给你一个字符串s和一个长度相同的单词列表。 找出s中所有子字符串的起始索引,这些字符串中的每个单词只是一个字符串,没有任何中介字符。
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- 把一个整数数组,分成个大小相同的子数组
- 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使
- 给你一个字符串s和一个长度相同的单词列表。 找出s中所有子字符串的起始索引,这些字符串中的每个单词只是一个字符串,没有任何中介字符。
- 信号板拼包:数组方式(bug长度只是截短,并未清空,若之后拷贝数据长度小于之前数据长度,老数据会接在后面)
- Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。 Input 输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义
- 题目四:给定一个数组,值可以为正、负和0,请返回累加和小于等于k的最长子数组长度。 时间复杂度:O(n)
- 一个大小为N(0<N<1000)的整数数组, 求该数组的子数组(长度大于2)为等差数列的个数?
- Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。 Input 输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- 一个一维整形数组,若干个数字,统计数组中不同的数字出现的次数,并按照出现频率从小到大排序输出,相同频率按数字大小排序输出
- 一个大小为N(0<N<1000)的整数数组, 求该数组的子数组(长度大于2)为等差数列的个数?
- 面试题:将一个字符串数组中的字母按照以下规则排列:表中任何单词的首字母与其前面单词的尾字母相同! 要求:字符串只由小写字母构成,且每个字符串长度在2-100之间
- 原来用循环链表写的现在用数组写(删除数据的,我找到了一个规律)
- c复习作业: 从键盘接受一个数组 数组的大小 随着输入数据的变化 而变化