40亿个非负整数中找到出现两次的数和所有数的中位数

2024-05-15 07:18

本文主要是介绍40亿个非负整数中找到出现两次的数和所有数的中位数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

40亿个非负整数中找到出现两次的数和所有数的中位数

【题目】

  32位无符号整数的范围是0-4294967295,现在有40亿个无符号整数,可以使用的最大内存是1GB,找出所有出现了两次的数。

【解答】

  对于在很多整数中找出现次数的题,一般是使用哈希表对出现的每一个数做词频统计的。但是这个题只需要找出现2次的整数,如果还使用哈希表 key表示出现的数,value表示出现的数的次数,那么这样需要的内存空间更大,而且对于出现次数大于2次的数没必要再去统计,所以哈希表在此处有点不太合适。那么应该怎么计算呢,我们先计算一下,如果每一个数用2位来做词频统计,那么就包括了0次是00,1次是01,2次是10,3次是11,这样就足够了,也省下不少空间,一个数2位,40亿个数就是80亿位,也就是10亿字节,那么就需要大概1GB的空间来处理,刚好满足条件。

具体计算步骤如下:

1、申请开辟一个长度为4294967295*2的bit数组,即bitArray[4294967295*2],占用内存空间约为1GB。

2、用bitArray数组的每2个位置表示一个出现的词频,遍历40亿个数,记为num,如果第一次出现num,则把

  bitArray[num*2]和bitArray[num*2+1]置为01,num第二次出现就把bitArray[num*2]和bitArray[num*2+1]设

  置为10,第三次出现就设置为11,如果大于3次出现则忽略不管,仍然保持11状态。

3、遍历bitArray数组,如果发现bitArray[i*2]和bitArray[i*2+1]的值是10,那么i就是出现了两次的数。



【进阶】

  如果将内存改为10MB,怎么找到40亿个整数的中位数?

【解答】

  




这篇关于40亿个非负整数中找到出现两次的数和所有数的中位数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

Collection的所有的方法演示

import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class TestCollection {/*** @param args* Collection的所有的方法演示* 此程序没有使用泛型,所以可以添加任意类型* 以后如果写到泛型会补充这一方面的内容*/public s

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

单精度浮点数按存储格式转为整数的程序

///#include<cstdio>//-----------------union int_char{unsigned char ch[4];float i;};void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上。{printf("单精度浮点数值为:%f\n",x.i,x.i);printf("存储位置从左到右