数据结构与算法学习篇给你一个文件里面包含全国人民(14亿)的年龄数据(0~200),现在要你统计每一个年龄有多少人?

文章描述了一个在资源有限(单台机器+1CPU+1G内存)的条件下,如何统计14亿条年龄数据(0-180岁)的分布情况,不使用现成的数据结构如map。提出了使用数组作为缓存桶的解决方案,通过读取文件一行行处理数据并更新数组计数,最终展示了程序运行时间和结果输出。
摘要由CSDN通过智能技术生成

给你一个文件里面包含全国人民(14亿)的年龄数据(0~180),现在要你统计每一个年龄有多少人?

限制: 给定机器为 单台+1CPU+1G内存。不得使用现成的容器,比如map等。

  1. 假设每个年龄数据为2位数,gbk编码下每个数字字符size = 1B,该文件总大小 = 14*(10^8)*2B /1000 /1000 /1000 = 1.4G , 一次放不下
  2. 且使用排序算法的话,排序的最高效算法时间复杂度为:O(nlogn) ,其中n=14亿,排不出来,而且内存也不够。
  3. 如果使用现成的容器可以直接解决,如不使用现成容器,可以考虑用数组来实现。

数组算法

int a[] = new int[180];

a[0]++; // 0表示的是0岁,a[0]的值表示的就是0有多少人.

下标:数组最优一个特点。这里可以通下标表示成有意义的数据,不只是数据里面的标记,年龄和下标对应。随机访问:可以直接通过下标定位到数组中的某一个数据(高效查询)

public class AgeStas {

	public static void main(String[] args) throws Exception {
		String str = null;
		String fileName = "/Users/WorkSpace/data-structure-algorithm/src/com/chenrx/algorithm/age.txt";
		InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName),"UTF-8");

		long start = System.currentTimeMillis();
		BufferedReader br = new BufferedReader(isr);
		int tot = 0 ;	// 14亿
		// 缓存桶
		int data[] = new int[200];
		while((str = br.readLine()) != null){		//一行一行的读 O(n)
			int age = Integer.valueOf(str);
			data[age] ++ ;
			tot ++ ;
		}
		// O(n) 14亿.
		// 单核Cpu处理速度(考虑了和内存的交互速度): 100万/秒 - 1000万/秒
		// 100s ~ 1000s之间
		// 16核 6s ~ 60s之间
		System.out.println("总共的数据大小: " + tot);
		
		for(int i = 0 ; i < 200 ; i ++){//下标从0开始的
			System.out.println(i + ":" + data[i]);
		}
		// 43757ms => 43s
		System.out.println("计算花费的时间为:" + (System.currentTimeMillis() - start) + "ms");
	}
}
// 输出结果
总共的数据大小: 1400000000
0:7780353
1:7778794
2:7773040
3:7779555
4:7776882
5:7773873
6:7778810
7:7777106
8:7781165
9:7782188
10:7774890
11:7776274
12:7778024
13:7777931
...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯十一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值