02 2011 档案

摘要:有些递归是很容易转化成循环的,用一个循环非常直观的映射过去就是了,如求Fibonacci数列; 而有些递归却没有那么直观,甚至可能需要多个循环才能转化过去,这里举个例子:给出一个集合,如(1, 2, 3, 4),打印出该集合的所有子集分析一下问题,子集是指取原集合中的任意多个元素,转化一下问题,就是对于原集合中的任何一个元素,我们都有两个选择,包含或者不包含,所以对于n个元素的集合,其子集数为: 2*2*2... = 2^n。那么可以得出其递归算法:递归的优点是直观、易懂:写起来如此,读起来也是这样。但是每次递归都是call stack的不断叠加,对于这个问题,其需要消耗O(n)的栈空间,栈空 阅读全文
posted @ 2011-02-12 08:18 lzprgmr 阅读(10693) 评论(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 阅读(9395) 评论(26) 推荐(10) 编辑

黄将军