随笔分类 -  [0] 算法

摘要:原题是这样的:在校园招聘的季节里,为了能让学生们更好地了解微软亚洲研究院各研究组的情况,HR部门计划为每一个研究组举办一次见面会,让各个研究组的员工能跟学生相互了解和交流(如图1-4所示)。已知有n位学生,他们分别对m个研究组中的若干个感兴趣。为了满足所有学生的要求,HR希望每个学生都能参加自己感兴趣的所有见面会。如果每个见面会的时间为t,那么,如何安排才能够使得所有见面会的总时间最短?最简单的办法,就是把m个研究组的见面会时间依次排开,那我们就要用m * t的总时间,我们有10多个研究小组,时间会拖得很长,能否进一步提高效率?此题的官方解法是将问题转化为一个已知的图的问题:即图的最少着色问题 阅读全文
posted @ 2011-03-19 14:45 lzprgmr 阅读(3486) 评论(5) 推荐(1) 编辑
摘要:看到有这么道算法题在博客园讨论,算法eaglet和邀月都已经设计出来了,花了点时间读了下,学到点东西顺便记录下来吧。题目是从1...n的数列中,找出总和为n的连续子数列。这里先设好算法中需要用到的关键变量:s:目标子数列的第一个元素k:目标子数列的长度那么目标子数列可以表示为(s, k)1. naive算法(n^2)最笨的,但是最容易的想到的方法,就是穷举所有的子数列:for s = 1 to n for k = 1 to n-s+1 if sum(s, k) == n output(s, k)复杂度为:n + (n-1) + (n-2) + (n-3).... = n(n-1)/2所以,其复 阅读全文
posted @ 2011-03-05 17:14 lzprgmr 阅读(2850) 评论(3) 推荐(1) 编辑
摘要:有些递归是很容易转化成循环的,用一个循环非常直观的映射过去就是了,如求Fibonacci数列; 而有些递归却没有那么直观,甚至可能需要多个循环才能转化过去,这里举个例子:给出一个集合,如(1, 2, 3, 4),打印出该集合的所有子集分析一下问题,子集是指取原集合中的任意多个元素,转化一下问题,就是对于原集合中的任何一个元素,我们都有两个选择,包含或者不包含,所以对于n个元素的集合,其子集数为: 2*2*2... = 2^n。那么可以得出其递归算法:递归的优点是直观、易懂:写起来如此,读起来也是这样。但是每次递归都是call stack的不断叠加,对于这个问题,其需要消耗O(n)的栈空间,栈空 阅读全文
posted @ 2011-02-12 08:18 lzprgmr 阅读(10704) 评论(8) 推荐(5) 编辑
摘要:这是在TL讨论中Liu xinyu给出的一个例子,觉得思路挺有启发的,所以整理记录一下。给定一个数组,其内容是一些随机的、不重复的正整数,如:{4, 23, 1, 8, 9, 21, 6, 12}要求找出不在数组中出现的最小的那个数,比如这个数组中未在数组中出现的最小值是:2这个问题实际应用的原型可以是一个ID分配系统,其使用一个数组来保存已分配的ID,每次回收就从数组中删除一个元素(O(n)),而分配则需要找到最小的那个可用的ID,就是这个算法要做的事情。这个问题从naive的解法到快速的解法的思路转换是十分巧妙的,当然,如果之前没有接触过类似的题,注意到这个特性应该不是一件很容易的事。设数 阅读全文
posted @ 2011-02-10 09:25 lzprgmr 阅读(9434) 评论(26) 推荐(10) 编辑
摘要:一般传统链表的物理结构,是由指针把一个一个的节点相互连接而成:其特点是按需分配节点,灵活动态增长。但是此外,还有另外一种方式是使用数组实现链表,这里所有的node都在预先分配好的数组中,不使用指针,而是用数组下标来指向前一个、下一个元素:其特点是预先分配节点,并且如果需要链表长度随需增加,需要reallocation ,和vector类似。下面就我自己的一些了解,谈一下其优缺点与应用。数组作链表有哪些优点能要省些内存吗?不见得;速度要快吗?没看出来,那么为什么要使用这种不那么直观的方式来实现链表呢?数组的内存布局比较紧凑,能占些局部性原理的光在不提供指针的语言中实现链表结构,如vb等进程间通信 阅读全文
posted @ 2010-08-22 08:05 lzprgmr 阅读(8922) 评论(10) 推荐(1) 编辑
摘要:有1到10000共10000个数,如果我从中随机拿走一个数,你如何知道我拿走了哪个? 相信很多人看过这道题,并知道答案,这几天和同事聊天时听到了这个问题,因为有过自己的思考过程,不妨记录下来。说是逻辑题,其实也算是一道算法题,同事先讲了下他被面试中的思维过程:先把10000个数相乘,然后再将拿走一个数之后的9999个数相乘,两者相除即可。 这个算法是正确的,但是会有两个潜在的问题:如此多的数相乘,其范围必然会超出系统提供的数据类型支持,当然你可以实现自己的大数表示的算法,但那样性能必然有影响。假设扩展一下题目,提供的数组中有0的话,乘法就不可用了。针对前面提出的问题,同事想到了使用加法,先求 阅读全文
posted @ 2010-06-23 21:50 lzprgmr 阅读(6041) 评论(20) 推荐(1) 编辑
摘要:从0~13中任取出7个数,然后判断这7个数中是否存在连续的5个数, 规则如下:1) 7个数可以是重复的数.2) 0可以表示任意数例子如下:0, 1, 4, 3, 8, 0, 13--->true: 1-2-3-4-50, 1, 1, 1, 9, 10, 0--->false0, 1, 3, 9, 10, 11, 12->true: 9-10-11-12-13 0, 0, 0, 0, 0, 0, 0->true: 0-1-2-3-4这是最近看到的一个算法题,粗粗一看,觉得很简单,可是慢慢往里面想,觉得要考虑的还是挺多的。现在把它实现出来放在 阅读全文
posted @ 2009-09-16 13:52 lzprgmr 阅读(1328) 评论(0) 推荐(0) 编辑
摘要:给出1, 2, 3, 4四个数, 请编程输出其全排列, 如:1 2 3 41 2 4 31 3 2 41 3 4 2...这样的题, 我们在学校的时候一般都遇到过,而我们最先能想到的,应该就是递归实现了,因为这和我们我理解的数学中的排列组合比较一致:先取第一个数,有4种可能,再在剩下的3个数种取出第二个数,这又有3种可能,这样下去直到取到最后一个数。 这样,4个数的全排列就有4*3*2 = 24个。n个数的全排列就是n*(n-1)*(n-2)*...*2*1. 按照这个描述, 我们发现有两点在程序中递归实现时十分重要:1. 哪些数已经取过了而哪些数又是没有取过,可以用的?2. 现在取的是哪一个 阅读全文
posted @ 2009-09-16 13:49 lzprgmr 阅读(1021) 评论(1) 推荐(0) 编辑

黄将军

点击右上角即可分享
微信分享提示