对大数据量进行排序--位图法

2024-04-29 14:08

本文主要是介绍对大数据量进行排序--位图法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:对2G的数据量进行排序,这是基本要求。

数据:1、每个数据不大于8亿;2、数据类型位int;3、每个数据最多重复一次。

内存:最多用200M的内存进行操作。

我听过很多种类似问题的解法,有的是内存多次利用,有的用到了外存,我觉得这两种做法都不是比较好的思想,太慢。由于这个题目看起来没有对效率进行约束,所以这两种方法也是对的,但是我这次提出一个比较好的算法来解答此题,如果有更好的做法请赶快跟帖留言,共同讨论。希望大神们的加入。。。。。

思想:把200M的内存平分,可以开两个数组,一个数组arr存放一遍不重复的所有数据,另一个数组arr_2只存放重复的数据。存放方法是对数组中的每个数据的位进行操作。比如:18这个数,18/32=0,18就会对应arr[0]这个数组中的某一位,而每一个数组元素都是32位组成,18%32=18,也就是说arr[0]那个数的第18位对应18这个数。同样道理再来一个数:43    43/32=1,43%32=11,也就是说43对应的是arr[1]中的第11位。只要找到了对应位置,把该位置1,其余位置不变(默认为0),遍历一次数据,就会把内存中的对应位置1.如果遇到重复数据,此时就会用到第二个数组了,若本次查询该位已经为1,那么就要把arr_2这个数组中的对应位置1。在输出的时候就要同步遍历两个数组。

输出:就是一个反向还原过程,遍历内存中的每一位,该位对应的有数组下标和所处位,进行一次乘、和运算就能还原回来数据,并依次写入文件或者打印到屏幕上。

废话不多说,直接上代码,如有问题,跟帖讨论。

#include <stdio.h>
#include <stdlib.h>
#define NUM 1024*1024	//数据占用的内存大小,即存储数据的载体
#define N	1024*1024*128	//10测试正确性可以用10来测	//数据量
unsigned long int arr[NUM];
unsigned long int arr_2[NUM];
unsigned long int temp[N];//本可不必开辟这个数组的,直接从文件中读取
int main(){
int i,j,temp_num=0,temp_num_2=0,flag=0;
//清空内存
memset(arr,0,sizeof(arr));
memset(arr_2,0,sizeof(arr_2));	
	//得到数据,存到数组中
for(i=0;i<N;i++){
temp[i]=N-i;
temp[i++]=N-i;
}
//下边这个循环是一个排序过程,把对应位置1,如果原来是1,就把另一块内存中的对应位置1
for(i=0;i<N;i++){
if(((arr[temp[i]/32] >> (temp[i]%32)) & 0x00000001) == 1)
arr_2[temp[i]/32] |= (0x00000001<<(temp[i]%32));
arr[temp[i]/32] |= (0x00000001<<(temp[i]%32));
}
printf("\n");
for(i=0;i<NUM && flag<N;i++){
if(arr[i] == 0)
continue;
temp_num=arr[i];
for(j=0;j<32;j++){
if((temp_num&0x00000001) == 0){
temp_num=(temp_num>>1);
}
else if((temp_num&0x0001) == 1){
printf("%d ",(i<<5)+j);
temp_num=(temp_num>>1);
temp_num_2=arr[i];
flag++;
//重复数据的输出
if((temp_num_2&0x00000001) == 1){
printf("%d ",(i<<5)+j);
flag++;
}
}
}
}
printf("\n");
return 0;
}




这篇关于对大数据量进行排序--位图法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946304

相关文章

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Python对PDF书签进行添加,修改提取和删除操作

《Python对PDF书签进行添加,修改提取和删除操作》PDF书签是PDF文件中的导航工具,通常包含一个标题和一个跳转位置,本教程将详细介绍如何使用Python对PDF文件中的书签进行操作... 目录简介使用工具python 向 PDF 添加书签添加书签添加嵌套书签Python 修改 PDF 书签Pytho

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代