求大数据量数组中不重复元素的个数

这篇博客介绍了如何在大数据量的数组中计算不重复元素的个数,通过使用标记数组marks和repmarks,结合位运算来高效地判断和标记重复元素。提供了三种不同的实现方式,优化了内存使用和计算效率。
摘要由CSDN通过智能技术生成
有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明);
要求找出这2.5亿个数字里面, 不重复的数字的个数(那些只出现一次的数字的数目)
另外,可用的内存限定为600M;
要求算法尽量高效,最优;

1. caoxic的算法
BYTE    marks[2^29];//512M   // BYTE marks[2^32/8]; //用这个就更清楚了,标志所有整数(2^32)出现的可能
BYTE    repmarks[2^25];//32M 32M*8>2.5亿  //标志2.5亿个数字数组里面的数字是否重复过
const BYTE bitmarks[8]={ 1,2,4,8,16,32,64,128};
DWORD    CalcDifNum(DWORD
*pBuf,DWORD bufcount)
{
    DWORD dw ;
    DWORD count
= 0 ;// 不重复的数字(包括出现多次的数字,只算一个)的个数,例子:1 2 2 3 5 3 4 算5个
    DWORD count2 = 0 ;//重复出现的数字的个数,例子:1 2 2 3 5 3 4 算2个
    memset(marks,0,sizeof(marks));
    memset(repmarks,
0,sizeof(repmarks));
    ASSERT(
sizeof(repmarks)*8>=bufcount);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值