求几亿个数中不重复元素的个数

news/2024/7/3 0:45:18

题目:

  有2.5亿个无符号整数(但在文件里面),要求找出这2.5亿个数字里面,不重复的数字的个数(那些只出现一次的数字的数目);另外,可用的内存限定为600M;要求算法高效、最优。

 

思路:

  这么多个数字,全部读到内存里面肯定不行的,那么就要读一些处理一些。试想用一个标志的数组,里面放的是true或者false,表示一个数字是否是第一次被读到,最好能够把这个数字就当做数组的下标来访问这个标志,比如读到234432,看flag[234432]是true还是false,这样就很方便了(这和哈希的思想不是挺类似的嘛)。

  好了,那么现在主要矛盾在这个flag标志数组该如何定义上了。无符号int,大小从 0 到 2^32 - 1(4字节的话),那么要保证数组足够大以至于能够用下标 2^32 - 1 来访问这个数的标志。true或false,那么也只要一位就够了,那么这个flag数组有多大呢:

  2^32 个bit 也就是 2^29 byte 也就 2^19 kb 也就 2^9 M 也就 512 M。这个大小小于600M,那么就内存来说是可以的。

 

代码:

 1 #include <iostream>
 2 #include <fstream>
 3 #include <cstdlib>
 4 #include <bitset>
 5 
 6 using std::cin;
 7 using std::cout;
 8 using std::endl;
 9 
10 int main(void)
11 {
12     const unsigned int thisIntMax = 0xffffffff;            //无符号int最大值,我的机子int是4字节
13 
14 #ifdef GENETATE_DATA
15     //生成很多值,其实这里太多了
16     std::ofstream fout("src.txt");
17     for (unsigned int i = 0; i < thisIntMax; i++)
18     {
19         unsigned int temp = std::rand();
20         fout << temp << endl;
21     }
22 #endif
23 
24     std::bitset<thisIntMax>* pArr = new std::bitset<thisIntMax>;            //默认值都是0,所以不要设置值了
25     std::ifstream fin("src.txt");
26     unsigned int temp, allCnt = 0, cnt = 0;
27 
28     while (fin >> temp)
29     {
30         allCnt++;
31         if (false == pArr->at(temp))            //注意这里要用at
32         {
33             cnt++;
34             pArr->set(temp);            //设为1
35         }
36         else
37         {
38             cout << temp << endl;
39         }
40         if (10000 == allCnt)
41             break;
42     }
43     cout << "Results:\n" << allCnt << endl << cnt;
44     delete pArr;
45     cin.get();
46 }

 

结果:

 

总结:

  用位来表明一个数是否出现过。

  直接把数字当做位数组的下标来进行访问。

转载于:https://www.cnblogs.com/jiayith/p/3936969.html


http://lihuaxi.xjx100.cn/news/246282.html

相关文章

android sqlite操作(2)

以下只是我个人的浅见,大神请忽略~ 这一篇说一下sqlite的相关操作,其实安卓提供了相当多的操作sqlite的方法,这里我介绍下我常用的方法。 (1)创建一个数据库文件,这个很简单 1 File dbPathFile new File(dbPath); 2 if(!dbPathFile.exists()) 3 try { 4 dbPathFil…

C++关键字const与constexpr

1. const 1.1. 修饰一般常量 一般常量是指简单类型的常量。这种常量在定义时&#xff0c;修饰符const可以用在类型说明符前&#xff0c;也可以用在类型说明符后。 例如&#xff1a; int const x 2; const int y 2; const std::string& name "csdn"; 1.2…

RNN,LSTM,GRU简单图解:

一篇经典的讲解RNN的&#xff0c;大部分网络图都来源于此&#xff1a;http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 每一层每一时刻的输入输出&#xff1a;https://www.cnblogs.com/lovychen/p/9368390.html 带有权重标识的图&#xff1a;

javascript里面RegExp的exec函数的总结

2019独角兽企业重金招聘Python工程师标准>>> 在我们的前端里面&#xff0c;经常会用到正则表达式进行检索字符串&#xff0c;刚好javascript里面提供RegExp来支持正则表达式&#xff0c;而RegExp对象的主要方法是exec()。 语法 RegExpObject.exec(string) 参数 描述…

详解zabbix中文版安装部署

一、zabbix简介&#xff08;摘自百度百科&#xff09;zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供柔软的通知机制以让系统管理员快速定位/解决存在…

C++关键字register

这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中&#xff0c;而不是通过内存寻址访问&#xff0c;以提高效率。注意是尽可能&#xff0c;不是绝对。你想想&#xff0c;一个CPU 的寄存器也就那么几个或几十个&#xff0c;你要是定义了很多很多register 变量&#xff0c;…

P4269 [USACO18FEB]Snow Boots G

思维题。 以地板为序构造链表&#xff0c;再排序&#xff0c;然后删除走不过去的地面。 删除的时候顺便维护最大的跨度&#xff0c;以此判断可行性。 总的来说利用了答案的单调性。 #include <cstdio> #include <cstring> #include <iostream> #include <…

怎样将jpg转换成pdf软件

为什么80%的码农都做不了架构师&#xff1f;>>> 怎样将jpg转换成pdf软件 序言&#xff1a; 企业或个人通常会遇到设备终端软件的兼容性和支持性问题&#xff0c;比如&#xff0c;JPG转PDF文本&#xff0c;这给等于给用户设置了一个门槛&#xff0c;遇到需要将JPG转换…