
算法
遥不可及梦
这个作者很懒,什么都没留下…
展开
-
只用2GB的内存找出20亿个整数中找到出现次数最多的数
要求有一个包含20亿个32位整数的文件,从中找到出现次数最多的数。首先先分析一下,32位int类型的数占4B,20亿个4B 约为 8GB,只用2GB肯定不够。所以我们肯定需要将这20亿个数哈希到不同的文件中,由于哈希函数的特性,对于相同的输入值,返回值也相同,所以不可能出现同一个值的数出现在不同的文件里,之后我们只需要在单个文件中,找到该文件中出现最多的数。将所有文件中出现次数最多的数都比较找到出原创 2016-07-26 11:13:06 · 3310 阅读 · 5 评论 -
40亿个非负整数中找到没出现的数
要求这里的非负整数是32位也就是0~2^32-1。最多用1GB的内存。如果只能用10MB的空间呢,只需要找到一个没有出现的数即可。首先先分析一下,40亿个4B约为16GB这里只用1GB,这里要求注意是找出没出现,这就和网页过滤系统类似,出现与不出现两个状态(0和1),那么我们就可以用bit数组来确定。我们用一个长度为2^32的bit数组,内存大小为2^29B为512MB不到一个GB。bit数组下标对原创 2016-07-26 11:46:03 · 652 阅读 · 0 评论 -
网页黑名单系统的算法核心
通过几个题来进行阐述网页黑名单系统(有一定的容错率,有限的空间)例如不安全网页的黑名单里有100亿个数据,每一个网页的URL最多占用64B。要求实现一种过滤系统,可以根据网页的URL判断是否在这个黑名单中。系统允许有万分之一的失误率。且额外的空间不能超过30GB。首先我们分析一下100亿= 10^10, 64 * 10 ^10 约为640GB的空间,所以要将所有的数据放入内存中,并找出是否包含不可能原创 2016-07-26 00:32:30 · 3596 阅读 · 0 评论 -
找到100亿个URL中的重复URL以及搜索词汇的topK问题
有一个包含100亿个URL的文件,假设每个URL占用64B,请找出其中所有重复的URL。这类问题一种解决方案(我只想到了这一种) 将文件通过哈希函数成多个小的文件,由于哈希函数所有重复的URL只可能在同一个文件中,在每个文件中利用一个哈希表做次数统计。就能找到重复的URL。这时候要注意的就是给了多少内存,我们要根据文件大小结合内存大小决定要分割多少文件topK问题和重复URL其实是一样的重复的多了原创 2016-07-27 18:06:09 · 9761 阅读 · 0 评论 -
堆排序
简单选择排序在选择一个最值时需要比较n-1次,在比较一个次最值的时候又需要进行n-2次,以此类推,在接下来的比较里都有重复的部分,但是我们没有将每次的比较结果记录下来。如果可以在每次选择中既找到了最值,又能将比较结果对其他记录进行调整。这样整体效率就会提高。 堆排序就做到了这一点。 堆排序的思想:将序列构造成一个大根堆,将根与数组尾部元素交换,将剩余的n-1个元素构造成一个大根堆,以此类推。将序原创 2016-08-02 17:53:02 · 323 阅读 · 0 评论 -
一次遍历返回序列的最大值和次大值
启发3个数的比较,先比较2个数,分出大小,后将大值与第三个数进行比较,若第三个数大,则将大值赋给次大值,将第三个数赋给最大值,若第三个数小,则与次大值比较,若第三个数大则将第三个数赋给次大值,否则不变。 `/*************************************************************** File Name: find_max_premax_val原创 2016-08-13 11:39:12 · 2490 阅读 · 0 评论