如何处理知道数据量为千万级的文件中的数据是否有重复?

hybest007 2009-06-20 11:53:10
数据是无符号整型,按行存储,如何处理知道数据有无重复?
...全文
146 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hybest007 2009-06-22
  • 打赏
  • 举报
回复
修改之后的代码:
#include <stdio.h>
#include <string.h>
#define MAXVALUE 2251726177

//a为char型,设置某一位为1
inline void setBit(char &a,int n)
{
a|=(1<<n);
}

//a为char型,判断某一位是否为1
inline int testBit(char a,int n)//返回0代表该位为0,非0代表该位为1
{
a&=(1<<n);
return a;
}

int main()
{
char *exist=new char[MAXVALUE/8];
memset(exist,0,MAXVALUE/8+1);
unsigned int iData[5]={381952348,1485458217,3,2251726177,1188383834};
for(int i=0;i <5;i++)
{
int p=iData[i]/8,q=iData[i]%8;
if(testBit(exist[p],q))
{
//之前已经出现
printf("数据有重复\n");
}
else//未出现过
{
setBit(exist[p],q);
}
}
}

还有一个问题,为什么 要p=n/8,q=n%8?对16、32操作可以吗?
setBit,testBit为什么要那样移位,有什么规则吗?
hybest007 2009-06-22
  • 打赏
  • 举报
回复
要对重复数据去重,该怎么做?
adventurelw 2009-06-21
  • 打赏
  • 举报
回复
可以用动态分配,我试了一下,用动态分配的bitset类足可以到数百兆
而最大的unsigned int除以8也不过500多兆,足够用了。
adventurelw 2009-06-21
  • 打赏
  • 举报
回复
应该是这种栈上内存分配有限制,我试了一下,大概可以分配到1M以下,但具体精确的上限是哪里,没试出来
分成区间处理吧。
比如每500万数据为一个区间,到最大的正整数,需要不超过1000个分段。
hybest007 2009-06-21
  • 打赏
  • 举报
回复
我所写的测试程序如下:
#include <stdio.h>
#define MAXVALUE 2251726177

//a为char型,设置某一位为1
inline void setBit(char &a,int n)
{
a|=(1<<(n-1));
}

//a为char型,判断某一位是否为1
inline int testBit(char a,int n)//返回0代表该位为0,非0代表该位为1
{
a&=(1<<(n-1));
return a;
}

int main()
{
char exist[MAXVALUE/8+1]={0};
unsigned int iData[5]={381952348,1485458217,381952348,2251726177,1188383834};
for(int i=0;i<5;i++)
{
int p=iData[i]/8,q=iData[i]%8;
if(testBit(exist[p],q))
{
//之前已经出现
printf("数据有重复\n");
}
else//未出现过
{
setBit(exist[p],q);
}
}
}

数据是无符号整型,在创建数组exist时就会出现溢出错误
pathuang68 2009-06-21
  • 打赏
  • 举报
回复
findcsdn 2009-06-20
  • 打赏
  • 举报
回复

只能存储文件的时候就排好序,这样二分查找起来很快的。

如果文件是乱序的,把文件预处理一下(排序),然后再做查询。


mengde007 2009-06-20
  • 打赏
  • 举报
回复
千万级别;确实很复杂;
  • 打赏
  • 举报
回复
只能用位图,或者hash做预处理。

之后查找就方便了。
hybest007 2009-06-20
  • 打赏
  • 举报
回复
开个bool数组内存不足的话,那就改用一个bit来做
怎么用bit做啊?
能说的具体点吗?谢谢!
hua_zhixing_ 2009-06-20
  • 打赏
  • 举报
回复
只是判断吗?
判断最大数是否小于文件的数量,小则有,反之。这样应该可以吧?
liao05050075 2009-06-20
  • 打赏
  • 举报
回复
使用Hash吧。最简单的那种。
就建一个hash_table[MaxValue],MaxValue是你所有数据中最大的数
然后就遍历一次所有数据,每次读入n,若hash_table[n]为0,就把它设为1,若它为1,那就是之前出现过了。
如果说开个bool数组内存不足的话,那就改用一个bit来做
hybest007 2009-06-20
  • 打赏
  • 举报
回复
文本格式,每行只有一个无符号整数,换行符'\n'
tkminigame 2009-06-20
  • 打赏
  • 举报
回复
是文本形式的?每行的数字数量是固定的还是随机的?换行符是什么?
「已注销」 2009-06-20
  • 打赏
  • 举报
回复
内存映射文件
liao05050075 2009-06-20
  • 打赏
  • 举报
回复
抱歉,上面的q=p%8应该是q=n%8
liao05050075 2009-06-20
  • 打赏
  • 举报
回复
来晚了。
按LS说的没错。
不过2^30是10亿多,也就是1G,如果改用bit来做,那就是1G/8=125M了

开一个char型的数组,长度为你所有元素中最大的那个MaxValue/8+1;如最大数为99999999,就开char exist[99999999/8+1]={0};

然后就读入一个数n,
int p=n/8,q=p%8;
if(test(exist[p],q))
{
//之前已经出现
}
else//未出现过
{
setBit(exist[p],q);
}


//a为char型,设置某一位为1
inline void setBit(char &a,int n)
{
a|=(1<<(n-1));
}

//a为char型,判断某一位是否为1
inline int testBit(char a,int n)//返回0代表该位为0,非0代表该位为1
{
a&=(1<<(n-1));
return a;
}

大概就是上面那样。
adventurelw 2009-06-20
  • 打赏
  • 举报
回复
可以用bitset操作位。
hybest007 2009-06-20
  • 打赏
  • 举报
回复
每个元素怎么用1bit存储?
crst_zh 2009-06-20
  • 打赏
  • 举报
回复
因为数据量很大,用数组的话得2^30个数组元素(4千万),假设每一个都占1字节,那就是2^30Byte,所以可以再压缩一下,每个元素用1bit来存储,出现,则相应的位为1,否则会0。遍历 的时候发现该位已经为1,就表示重复了。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧