算法习题之资源限制类的算法题目

资源限制类的算法题目

  • 布隆过滤器用于集合的建立与查询,并可以节省大量空间
  • 一致性哈希解决数据服务器的负载管理问题
  • 利用并查集结构做岛问题的并行计算
  • 哈希函数可以把数据按照种类均匀分流
  • 位图解决某一范围上数字的出现情况,并可以节省大量空间
  • 利用分段统计思想、并进一步节省大量空间
  • 利用堆、外排序来做多个处理单元的结果合并
  • 习题 1 32位无符号整数的范围是0~4,294,967,295,现在有一个正好包含40亿个无符号整数的文件,可以使用最多1GB的内存,怎么找到出现次数最多的数?
  • 习题 2 32位无符号整数的范围是0~4,294,967,295,现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然存在没出现过的数。可以使用最多1GB的内存,怎么找到所有未出现过的数?【进阶】内存限制为 3KB,但是只用找到一个没出现过的数即可
  • 习题 3 有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出其中所有重复的URL【补充】某搜索公司一天的用户搜索词汇是海量的(百亿数据量),请设计一种求出每天热门Top100词汇的可行办法
  • 习题 4 32位无符号整数的范围是0~4294967295,现在有40亿个无符号整数,可以使用最多1GB的内存,找出所有出现了两次的数。
  • 习题 5 32位无符号整数的范围是0~4294967295,现在有40亿个无符号整数 可以使用最多3K的内存,怎么找到这40亿个整数的中位数?
  • 习题 6 32位无符号整数的范围是0~4294967295,有一个10G大小的文件,每一行都装着这种类型的数字,整个文件是无序的,给你5G的内存空间,请你输出一个10G大小的文件,就是原文件所有数字排序的结果

布隆过滤器用于集合的建立与查询,并可以节省大量空间

一致性哈希解决数据服务器的负载管理问题

利用并查集结构做岛问题的并行计算

哈希函数可以把数据按照种类均匀分流

位图解决某一范围上数字的出现情况,并可以节省大量空间

利用分段统计思想、并进一步节省大量空间

利用堆、外排序来做多个处理单元的结果合并

习题 1 32位无符号整数的范围是0~4,294,967,295,现在有一个正好包含40亿个无符号整数的文件,可以使用最多1GB的内存,怎么找到出现次数最多的数?

	创建400个小文件,每个小文件1000w种数,将40亿个无符号整数转换成字符串,再%400就是当前数归于哪一号文件,数归好后,用hashMap统计每一个文件(统计完一个文件释放掉)
	一条(int,int)的hashMap占8个Byte,400 * 1000w种数等于40亿,1个G装1000w绰绰有余

习题 2 32位无符号整数的范围是0~4,294,967,295,现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然存在没出现过的数。可以使用最多1GB的内存,怎么找到所有未出现过的数?【进阶】内存限制为 3KB,但是只用找到一个没出现过的数即可

	1.创建int的数组保证每一位都代表一个数,位上的数值不为1就是不存在的数
	2.1. 3kb是3072个byte可以组成768个int,向左取最接近2的倍数的数512
	2.2 创建长度为512的int数组,每一个int记录8388608个数,int[0] 记录0~8388608出现的次数,每个数字只记录一次
	2.3 将int中记录不满8388608的再分为512份,继续2.2的操作,直到找出一个没有出现过的数
	3.1 用有限几个变量,用三个变量分别为L,mid,R,记录L-mid出现的次数,mid-R出现的次数
	3.2 不为2的31次方的数继续重复3.1

习题 3 有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出其中所有重复的URL【补充】某搜索公司一天的用户搜索词汇是海量的(百亿数据量),请设计一种求出每天热门Top100词汇的可行办法

	1.利用hash函数的离散性,将100亿个文件分为x个小文件,在每个文件中统计url出现的次数
	2.在每个小文件中取出TOP100的url,进行整合后取出Top100

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

	创建int的数组,每两位代表一个数出现的次数,00没出现过,01出现了一次,10出现了两次,11出现3次及以上

习题 5 32位无符号整数的范围是0~4294967295,现在有40亿个无符号整数 可以使用最多3K的内存,怎么找到这40亿个整数的中位数?

    1.13kb是3072个byte可以组成768个int,向左取最接近2的倍数的数512
	1.2创建长度为512的int数组,每一个int记录8388608个数,int[0] 记录0~8388608出现的次数,每个数字只记录一次
	1.3中位数在从int[0]开始统计数,刚到2亿的int里,再把那个int进行1.2的操作

习题 6 32位无符号整数的范围是0~4294967295,有一个10G大小的文件,每一行都装着这种类型的数字,整个文件是无序的,给你5G的内存空间,请你输出一个10G大小的文件,就是原文件所有数字排序的结果

  用一个小于5G空间的大根堆,堆中存储数字,与出现的次数,每次过一遍数,将堆中的数记录,并将最大的数进行记录,大于最大数的值不再入堆

你可能感兴趣的:(算法)