首页 > 其他分享 >计数+分治求海量数据中重复最多的一个

计数+分治求海量数据中重复最多的一个

时间:2022-12-13 17:38:23浏览次数:26  
标签:次数 海量 IP 分治 unsigned 计数 IP地址 32 data





海量数据中求取出现次数最多的一个:

计数法:

(一).思想:

(1)假设一天之内某个IP访问百度的次数不超过40亿次,则访问次数可以用unsigned表示.用数组统计出每个IP地址出现的次数, 即可得到访问次数最大的IP地址。
(2^32=2^2*2^30=4G=40亿)

(2)IP地址是32位的二进制数,共有N=2^32=4G个不同的IP地址, 创建一个unsigned count[N]的数组;而sizeof(count) == 4G*4=16G>4G(计算机内存),不可以直接创建这个数组。

(3)假设允许使用的内存是512M, 512M/4=128M (每个ip32位,4B),即512M内存可以统计128M个不同的IP地址的访问次数,N/128M =4G/128M = 32 .

(4)所以:只要把IP地址划分成32个不同的区间,分别统计出每个区间中访问次数最大的IP, 然后就可以计算出所有IP地址中访问次数最大的IP了.

(5)因为2^5=32,所以可以把IP地址的最高5位作为区间编号,把相同区间的IP地址保存到同一的临时文件中.

(二).举例:
如: ip1=0x1f4e2342,ip1的高5位是id1 = ip1 >>27 = 0x11 = 3, ip1的其余27位是value1 = ip1 &0x07ffffff = 0x074e2342,所以把 value1 保存在tmp3文件中。由id1和value1可以还原成ip1, 即 ip1 =(id1<<27)|value1。

按照上面的方法可以得到32个临时文件,每个临时文件中的IP地址的取值范围属于[0-128M)
128M=2^7* 2^20=2^27(即IP的低27位),因此可以统计出每个IP地址的访问次数.从而找到访问次数最大的IP地址。

(三).代码实现如下:

#include <fstream>  
#include <iostream>
#include <ctime>

using namespace std;
#define N 32 //临时文件数

#define ID(x) ((x)>>27) //x对应的文件编号
#define VALUE(x) ((x)&0x07ffffff) //x在文件中保存的值
#define MAKE_IP(x,y) (( (x)<<27)|(y) ) //由文件编号和值得到IP地址.

#define MEM_SIZE 128*1024*1024
//需分配内存的大小为 128M,MEM_SIZE*sizeof(unsigned)

char* data_path="D:/test/ip.dat"; //ip数据

//产生n个随机IP地址 ,写入到文件中。
void make_data(const int& n)
{
ofstream out(data_path,ios::out|ios::binary);
srand((unsigned)(time(NULL))); //设置时间种子
if (out)
{
for (int i=0; i<n; ++i)
{
unsigned val=unsigned(rand());
val = (val<<24)|val; //产生unsigned类型的随机数

out.write((char *)&val,sizeof (unsigned));
}
}
}

//找到访问次数最大的ip地址
int main()
{
//make_data(100); //
make_data(100000000); //产生测试用的1亿个IP数据
fstream arr[N]; //N为临时文件数。

for (int i=0; i<N; ++i) //创建N个临时文件
{
char tmp_path[128]; //临时文件路径
sprintf(tmp_path,"D:/test/tmp%d.dat",i);
arr[i].open(tmp_path, ios::trunc|ios::in|ios::out|ios::binary);
//打开第i个文件

if( !arr[i])
{
cout<<"open file"<<i<<"error"<<endl;
}
}

ifstream infile(data_path,ios::in|ios::binary); //读入测试用的IP数据
unsigned data;

while(infile.read((char*)(&data), sizeof(data)))
{
unsigned val=VALUE(data);
int key=ID(data);
arr[ID(data)].write((char*)(&val), sizeof(val));
//保存到临时文件件中
}

for(unsigned i=0; i<N; ++i)
{
arr[i].seekg(0);
}
unsigned max_ip = 0; //出现次数最多的ip地址
unsigned max_times = 0; //最大只出现的次数

//分配512M内存,用于统计每个数出现的次数
unsigned *count = new unsigned[MEM_SIZE];

for (unsigned i=0; i<N; ++i)
{
memset(count, 0, sizeof(unsigned)*MEM_SIZE);

//统计每个临时文件件中不同数字出现的次数
unsigned data;
while(arr[i].read((char*)(&data), sizeof(unsigned)))
{
++count[data];
}

//找出出现次数最多的IP地址
for(unsigned j=0; j<MEM_SIZE; ++j)
{
if(max_times<count[j])
{
max_times = count[j];
max_ip = MAKE_IP(i,j); // 恢复成原ip地址.
}
}
}
delete[] count;
unsigned char *result=(unsigned char *)(&max_ip);
printf("出现次数最多的IP为:%d.%d.%d.%d,共出现%d次",
result[0], result[1], result[2], result[3], max_times);
}

标签:次数,海量,IP,分治,unsigned,计数,IP地址,32,data
From: https://blog.51cto.com/u_15911260/5934906

相关文章

  • C++ 不知算法系列之聊聊希尔、归并排序算法中的分治哲学
    1.前言排序算法中,冒泡、插入、选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置。希尔、归并、快速排序算法也可归为同一类,它......
  • 分治法与动态规划的区别
    1.分治法与动态规划主要共同点:二者都是将原问题分而治之,分解成若干个规模较小(小到很容易解决的程序)的子问题,然后将子问题的解合并,形成原问题的解。2.分治法与动态规......
  • 教你用JavaScript实现实时字符计数器
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个实时字符计数器。用户在指定位置打字,程序实时显示字符数量。......
  • 当FTP不能满足大文件、海量文件传输时,有没有好的替代方案?
    很多企业存在大文件、海量文件的传输需求,如涉及到图像数据采集和回传、海量用户数据收集和同步等业务,一般情况,企业还是会采用传统的FTP传输,或者以此为基础,使用脚本或结合其......
  • 7天7项云服务 | 03-对象存储Object Storage,将海量对象文件转成链接
           2006年3月,AWS发布了简单存储服务(S3,SimpleStorageService),这也是云计算从此商业化的标志性事件,是云计算的第一个产品。              有......
  • 海量训练数据
    MongoDB实现查询、分页和排序操作以及游标的使用https://www.jb51.net/article/254753.htmMongoDB按照时间段查询某个物理机的CPU使用率,按照时间倒序排序,取出最新的5条......
  • [数学记录]P1232 树的计数
    题意:给出一棵树的dfs序和bfs序,求所有可能的原树的高度平均值\(n\leq2\cdot10^5\)首先把bfs序变成\(1\ton\),这样就需要把原树上的节点分成若干层。设\(......
  • TDH社区版上新宽表数据库Hyperbase,轻松实现海量数据的毫秒级精确检索
     日前,为了降低用户接触使用大数据技术的门槛以及成本,星环科技推出TDH社区版(TranswarpDataHubCommunityEdition)来帮助企业用户、高校师生、科研机构以及其他专业开......
  • excel科学计数法转换成文本完整显示
    1、首先打开含有科学计数法显示的excel;2、在excel最上面的菜单栏点击数据,找到“分列”选项;3、点击“分列“选项,进入分列向导,采用默认选项;4、点击下一步,还是采用默认选项......
  • 算法学习笔记(40)——组合计数
    组合计数组合计数求组合数I——预处理组合数求组合数II——预处理阶乘求组合数III——卢卡斯定理(Lucas)求组合数IV——高精度满足条件的01序列——卡......