随笔分类 - 算法类
统计论坛在线人数分布
摘要:题目:求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。一天总共有 3600*24 = 86400秒。定义一个长度为86400的整数数组int delta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。开始时将数组元素都初始化为0。然后依次读入每个用户的登录时间和退出时间,将与登录时间对应的整数值加1,将与退出时间对应的整数值减1。这样处理一遍后数组中存储了每秒中的人数变化情况。定义另外一个长度为86400的整数数组int online_num[8
阅读全文
找到两个字符串的公共字符,并按照其中一个的排序
摘要:题目:写一函数f(a,b),它带有两个字符串参数并返回一串字符,该字符串只包含在两个串中都有的并按照在a中的顺序。写一个版本算法复杂度O(N^2)和一个O(N) 。O(N^2):对于a中的每个字符,遍历b中的每个字符,如果相同,则拷贝到新字符串中。O(N):首先使用b中的字符建立一个hash_map,对于a中的每个字符,检测hash_map中是否存在,如果存在则拷贝到新字符串中。
阅读全文
删除链表中的重复项
摘要:题目:一个没有排序的链表,比如list={a,l,x,b,e,f,f,e,a,g,h,b,m},请去掉重复项,并保留原顺序,以上链表去掉重复项后为newlist={a,l,x,b,e,f,g,h,m},请写出一个高效算法(时间比空间更重要)。建立一个hash_map,key为链表中已经遍历的节点内容,开始时为空。从头开始遍历链表中的节点:- 如果节点内容已经在hash_map中存在,则删除此节点,继续向后遍历;- 如果节点内容不在hash_map中,则保留此节点,将节点内容添加到hash_map中,继续向后遍历。FROM:http://hi.baidu.com/mianshiti/blog/i
阅读全文
一个大的含有50M个URL的记录,一个小的含有500个URL的记录,找出两个记录里相同的URL
摘要:题目:一个大的含有50M个URL的记录,一个小的含有500个URL的记录,找出两个记录里相同的URL。第1种方法首先使用包含500个url的文件创建一个hash_set。然后遍历50M的url记录,如果url在hash_set中,则输出此url并从hash_set中删除这个url。所有输出的url就是两个记录里相同的url。第2种方法AC自动机
阅读全文
17道经典海量数据面试题整理
摘要:1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。s 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。这样每个小文件的大约为300M。s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为)。这样处理后,所有可能相同的url都在对应的小文件()中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小
阅读全文
找出被修改过的数字
摘要:题目:n个空间(其中n<1M),存放a到a+n-1的数,位置随机且数字不重复,a为正且未知。现在第一个空间的数被误设置为-1。已经知道被修改的数不是最小的。请找出被修改的数字是多少。例如:n=6,a=2,原始的串为5, 3, 7, 6, 2, 4。现在被别人修改为-1, 3, 7, 6, 2, 4。现在希望找到5。第1种方法:由于修改的数不是最小的,所以遍历第二个空间到最后一个空间可以得到a的值。a 到 a+n-1这 n个数的和是 total = na + (n - 1)n/2。将第二个至最后一个空间的数累加获得 sub_total。那么被修改的数就是 total - sub_total
阅读全文
在100w个数中找最大的前100个数
摘要:应该使用某种数据结构保存迄今最大的100个数。每读到一个新数时,将新数和保存的100个数中的最小一个相比较,如果新数更大些,则替换。这样扫描一遍100w个数也就获得了最大的100个数。对于保存的100个数的数据结构,应该在最小复杂度的条件下满足1)可以获得最小的数;2)将最小数替换为另一个数后可以重新调整,使其可以满足条件1。可见小根堆可以满足这些条件。所以应该采用小根堆+扫描的方法。http://hi.baidu.com/mianshiti/blog/item/37652f27a3ac4320d5074252.html
阅读全文
双链表拷贝(2-linked list)
摘要:题目:有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand(可能为空,也有可能为自身),如何拷贝这个特殊链表?思路:拷贝pNext指针非常容易,所以题目的难点是如何拷贝pRand指针。假设原来链表为A1 -> A2 ->... -> An,新拷贝链表是B1 -> B2 ->...-> Bn。为了能够快速的找到pRand指向的节点,并把对应的关系拷贝到B中。我们可以将两个链表合并成A1 -> B1 -> A2 -> B2 -> ... -> An -> Bn。从A1节
阅读全文
从海量日志中提取访问百度次数最多的IP
摘要:P地址最多有2^32=4G种取值可能,所以不能完全加载到内存中。可以考虑分而治之的策略,按照IP地址的hash(IP)%1024值,将海量日志存储到1024个小文件中。每个小文件最多包含4M个IP地址。对于每个小文件,可以构建一个IP作为key,出现次数作为value的hash_map,并记录当前出现次数最多的1个IP地址。有了1024个小文件中的出现次数最多的IP,我们就可以轻松得到总体上出现次数最多的IP。P地址最多有2^32=4G种取值可能,所以不能完全加载到内存中。可以考虑分而治之的策略,按照IP地址的hash(IP)%1024值,将海量日志存储到1024个小文件中。每个小文件最多包含
阅读全文
找出数组中出现次数超过一半的数
摘要:现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。第1种方法:创建一个hash_map,key为数组中的数,value为此数出现的次数。遍历一遍数组,用hash_map统计每个数出现的次数,并用两个值存储目前出现次数最多的数和对应出现的次数。这样可以做到O(n)的时间复杂度和O(n)的空间复杂度,满足题目的要求。但是没有利用“一个数出现的次数超过了一半”这个特点。也许算法还有提高的空间。第2种方法(推荐):使用两个变量A和B,其中A存储某个数组中的数,B用来计数。开始时将B初始化为0。遍历数组,如果B=0,则令A等于当前数,令B等于1;如果当前数与A相同,则
阅读全文
如何找出字典中的兄弟单词
摘要:给定一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给定一个字典,用户输入一个单词,如何根据字典找出这个单词有多少个兄弟单词?
阅读全文
给定一个数组,问其中是否有两个数的和为10?
摘要:给定一个数组,问其中是否有两个数的和为10?
阅读全文
给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)
摘要:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)
阅读全文
用两个栈实现一个队列的功能 && 两个队列实现一个栈的功能 && 代码实例
摘要:用两个栈实现一个队列的功能 && 两个队列实现一个栈的功能 && 代码实例
阅读全文
编程实现两个正整数的除法,当然不能用除法操作符。
摘要:移位操作---编程实现两个正整数的除法,当然不能用除法操作符
阅读全文
[删除字符串中多余的空格]给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个
摘要:[删除字符串中多余的空格]给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个
阅读全文
1分2分5分的硬币,组成1角,共有多少种组合
摘要:1分2分5分的硬币,组成1角,共有多少种组合
阅读全文
浙公网安备 33010602011771号