有10亿个整数,要求选取重复次数最多的100个整数

解决这个问题有多种方法,包括不限于无内存限制时使用整数数组,内存受限时的分段处理,使用哈希表统计以及随机采样等。时间复杂度和空间复杂度会根据不同的算法而变化。对于内存有限的情况,可以将整数空间分段并分别处理,最后再求解第k大元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 有10亿个整数,要求选取重复次数最多的100个整数
要解答这个问题,首先要弄清楚下面几个条件。
(1)有内存限制吗?
(2)整数的范围是多少?有符号,无符号,32位还是64位?
(3)整数集的内容大吗?(即出现的整数空间的大小大吗?)
(4)如果只需要求模糊解,怎么解?
(5)求数组中的第k大元素?
(6)相关问题:求一个整数列中出现次数最多的整数
(7)相关问题:有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。

(1)如果没有内存限制,且假设是32位无符号的整数。最方便的办法就是建立一个整形数组,int hash[2^32](赞不考虑程序的虚地址空间上限),然后对这10亿个数进行一次遍历,这样,可以得到这2^32个数各自出现的次数,再对这个 hash数组进行取第k大元素,100次后,就可以取出这出现次数最多的前100个数。遍历10亿个数的时间复杂度是O(n),n=10^10,求第k大 元素的时间复杂度是O(m),m=2^32(=4294967296),那么本算法的时间复杂度是O(n),空间复杂度是O(s),s=2^32。内存要 2^32*4=16G
(2)如果有内存限制,或者必须满足程序虚地址空间上限。那么可以对整数空间进行分段处理,比如只提供512M内存,则将2^32个整数划分成32个空间 0~2^(27)-1,2^(27)~2^(28)-1,...,31*2^(27)~2^(32)-1。对原来的10亿个数遍历32次,每次遍历,得到 每个空间的整数的出现次数,并求出此空间中,出现次数最多的前100个整数,保存下来。这样32次之后,就得到了出现次数前3200的整数,再对这 3200个整数取第k大元素,得到出现次数最多的前100个整数。这个算法的时间复杂度也是O(n),空间复杂度降低多少不知道,但是内存使用降低不少。
(3)如果整数空间比较小,也就是说这10亿个数中有很多重复的数,最方便的办法估计就是维护一个HashTable对象ht,key就是整数 值,value就是该整数值出现的次数。遍历这10亿个元素,得到ht后再对

森罗殿的光束交错 暂无评定 CSP-S组 文件IO 传统题 来源 TomAnderson 时间限制 1000ms 内存限制 256MB 输入文件名 light.in 输出文件名 light.out 题目背景 莽林如渊,层层叠叠的枝干伸向天空,形成一片墨绿穹窿。底下潮湿的苔藓贪婪地铺展着,在这片深绿包裹之中,几道残破石阶蜿蜒而上,引向一座森罗殿。 殿宇在惨白月光里显出轮廓,青黑的石料上爬满了深绿色的藤蔓,宛如无数冰冷而滑腻的手臂缠绕着。门旁石兽的雕像被风雨剥蚀得面目模糊,仅余下些半人半兽的粗野轮廓,于黑暗中无言地蹲踞着,似在守护,又似在诅咒。 zls 作为一名狂热的探险爱好者来到了这里,根据前辈所言,只有解开这里的光柱谜题,才可开辟寻觅宝藏的小径。 题目描述 有 2 � 2n 个环状排布的带权点,第 � i 个点权值为 � � d i ​ ,权值相同的两个点可以连一条边,使得边的交点最多,同时满足如下约束: 任意一个点的度最多为 1 1,即最多连一条边。 一条边最多只能与一条边相交。 满足上述条件的图中必然有 2 � 2k 个点被连了边,应使得环上存在一个长度为 � n 的连续区间,使得该区间内有且只有 � k 个被连边的点,且它们互不连边。 例如(下图点左侧数字为编号,右侧为权值): 这里编号为 2 2 的点连了两条边,不满足约束。 这里编号为 3 3、 8 8 的点所连的边与两条边相交,不满足约束。 这里不存在一个长度为 7 7 的连续区间,使得该区间内有且只有 4 4 个被连边的点,且它们互不连边,不满足约束。 输入格式 输入共 2 2 行。 第一行一个整数 � n。 第二行 2 � 2n 个数 � 1 d 1 ​ 、 � 2 d 2 ​ 、…、 � 2 � d 2n ​ 表示每个点的权值(即石柱权值)。 输出格式 一行一个整数,表示最大交点数(最多强光斑数)。 input1 复制 6 1 3 1 3 1 3 1 3 1 3 1 3 output1 复制 3 input2 复制 11 1 2 3 3 2 4 1 5 3 5 4 3 5 5 1 12 4 2 3 2 1 3 output2 复制 3 说明/提示 对于 40 % 40% 的数据有 1 ≤ � ≤ 15 1≤n≤15。 对于另外 10 % 10% 的数据有 � = 2 k=2。 对于 100 % 100% 的数据有 1 ≤ � ≤ 300 1≤n≤300, 1 ≤ � � ≤ 10 9 1≤d i ​ ≤10 9 。编写C++代码完成
最新发布
08-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值