Python 排序2^30个32位整数。最佳解决方案
我有一个包含2^30个无符号32位整数值的文件,我需要对它们进行排序,所以我想用最快的算法来完成。需要使用所有可用的处理器,并且使用的内存不超过256MB 我现在的想法是: 最大整数值(对于32位整数)Sm=2^32,最小值=0。可用内存为M=2^28Python 排序2^30个32位整数。最佳解决方案,python,algorithm,sorting,computer-science,Python,Algorithm,Sorting,Computer Science,我有一个包含2^30个无符号32位整数值的文件,我需要对它们进行排序,所以我想用最快的算法来完成。需要使用所有可用的处理器,并且使用的内存不超过256MB 我现在的想法是: 最大整数值(对于32位整数)Sm=2^32,最小值=0。可用内存为M=2^28 设备的输出文件 Sm*(sizeof int)/M=2^32*2^5/2^28=2^9个零件; 每个零件尺寸为2^32/2^9=2^23 首先,编写一个简单的读取器,从输入文件中读取int值,检查它位于什么范围内,并将这个范围内的整数放入te
- 设备的输出文件 Sm*(sizeof int)/M=2^32*2^5/2^28=2^9个零件; 每个零件尺寸为2^32/2^9=2^23
1 file= Integers from 0:2^23
2 file = 2^23:2^24
3 file = 2^24:(2^24+2^23),
and etc...
- 使用标准算法进行排序,如qsort或金字塔排序(对此算法有何建议?)
由于内存不足,无法一次对所有内容进行排序,因此必须将工作划分为适合内存的部分,对每个部分进行排序,并将结果保存到磁盘,然后以类似于合并过程的方式合并结果。合并不需要将整个内容加载到内存中,只需在编写最终结果时读取部分内容 考虑使用MergeSort。可在此处找到简短说明:
合并排序非常适合于并行实现和内存限制。考虑使用合并排序。可在此处找到简短说明:
合并排序非常适合于并行实现和内存限制。基数排序通常被称为O(n),但实际上是O(nlogn),因为它需要与最大数字中的位数成比例的时间*数字计数,并且位数趋向于log(n) 我建议使用3级复合排序:
一定要让每个核心排序一个大的子列表-这对多核系统会有很大帮助。有时对#3使用minheap是好的,有时最好只使用数组(对于较小数量的大型子列表)。基数排序通常被称为O(n),但实际上是O(nlogn),因为它需要与最大数字中的位数成比例的时间*数字计数,并且数字的数量趋向于log(n) 我建议使用3级复合排序:
a. [0, 2^20 - 1], [2^20, 2^21 - 1]....
// for each part
int start = 0; // the starting point of the part
int end = 2^20 - 1; // the ending point of the part
int *hash = new int[end - start + 1];
for (int i = start; i <= end; ++i) {
// read a integer val
++hash[val];
}
for (int i = start; i <= end; ++i) {
if (hash[i] > 0) {
for (int j = 0; j < hash[i]; ++j) {
// print i
}
}
}