上一页 1 2 3 4 5 6 7 8 9 10 ··· 15 下一页
摘要: 最优二叉查找树的一道思考习题同最优二叉查找树一样,矩阵连乘问题也是一个卡特兰数问题(其动态规划的构造过程都很像)----------------------------------------------------------------------------------------------------------------------------------------------------分析解答:a,铺垫的数学知识首先要搞清楚矩阵相乘是怎么乘的:1)对于连续的n个矩阵相乘 A1 * A2 *A3.........An,其乘法顺序可以是任意的,可以在上面加括号,改变做乘法的顺序 阅读全文
posted @ 2011-07-02 11:32 jinmengzhe 阅读(3305) 评论(0) 推荐(1)
摘要: 前面说过动态规划最典型的就是解决最优化问题的(具有最优子结构的最优化问题),最优二叉查找树就是一个典型的最优化问题。问题描述:给定一个n元素的中序序列,它可以有卡特兰数个不同形状的二叉排序树。(卡特兰数的定义及证明参见组合数学):,如果我们知道每个键的查找概率,怎么来构造一个平均查找代价最小(查找成功)的最优二叉查找树呢?-------------------------------------------------------------------------------------------------------------用动态规划来求解,首先要找到它的最优子结构性质,然后根据这 阅读全文
posted @ 2011-07-02 00:39 jinmengzhe 阅读(5589) 评论(0) 推荐(1)
摘要: 上2篇详细分析了动态规划的一些理解,传统的教材上就大概说了下空间换时间,记忆以避免重复计算等。然后我们在文章中深入的分析和解释了交叠子问题是怎么表现的,最优子结构的表现,多阶段决策(无后效性)的表现,递推式(状态转移方程),一个状态表示一个子问题的解,动态规划就是将问题划分为规模不是太大的子问题,动态规划填矩阵的顺序(拓扑排序)以及空间复杂度的优化跟什么有关等等。计算二项式系数其实可以看成是不是解决最优问题的一个动态规划的特例,这节我们再来介绍2个动态规划的算法:Warshall算法(也可以说是不是最优问题,但它也可以表现为动态规划的过程)和Floyd算法。------------------ 阅读全文
posted @ 2011-07-01 01:53 jinmengzhe 阅读(8597) 评论(1) 推荐(2)
摘要: 学习DP过程中的一些和大牛交流的心得:差不多就是我理解的一个阶梯过程,为保护隐私,去掉名字了:石头16:23:46 动态规划是不是一般就是填矩阵? 石头16:23:54 感觉大牛XXX16:24:25 差不多吧 大牛XXX16:24:28 填矩阵。。。。 大牛XXX16:24:31 可以这么理解 石头16:25:10 ???从前面小范围的解经过一系列比较复杂的数学推导往大范围填 大牛XXX16:25:19 嗯差不多 大牛XXX16:25:29 其实动态规划可以有很多种理解 石头16:25:55 还有啥你说下我扩展下思路 大牛XXX16:25:58 我觉得本质就是把一个大问题转化为一个小一点的问 阅读全文
posted @ 2011-07-01 01:40 jinmengzhe 阅读(3375) 评论(3) 推荐(3)
摘要: 终于来到了算法设计思想中最有趣的这部分,在去年的google笔试中,7道算法设计题有2道动态规划(Dynamic Programming)。看了这么久的算法,这部分也是唯一感觉到了比较难的地方,从这篇文章开始,将花连续的篇幅来讨论一些对动态规划的认识和其中的问题。这包括一些例子:计算二项式系数,Wa... 阅读全文
posted @ 2011-06-26 16:36 jinmengzhe 阅读(71775) 评论(27) 推荐(29)
摘要: 散列法的基本思想是把键分布在一个称为散列表的一维数组H[0.......m-1]中,我们可以对每个键计算某些被称为散列函数的预定义函数h的值,来完成这种分布。该函数为每个键确定它在H中的下标。一般来说,hash函数的要求:1)使得键在hash表里尽可能均匀的分布2)hash函数必须容易计算显然,如果选择的散列表长度m小于键的数量n,则会碰撞。这是一种2个或多个键被hash到散列表的同一个单元格的情况。即使m相对于n足够大,这种情况仍会发生。有2种解决碰撞的方法:开散列(分离链)和闭散列(开放地址),以下分别介绍,并用开散列的方式模拟实现一个hash表。--------------------- 阅读全文
posted @ 2011-06-26 15:00 jinmengzhe 阅读(1767) 评论(1) 推荐(1)
摘要: 引入问题:考虑一个计算函数值的问题: 你可以完全不用任何计算方法,先把函数值计算好(例如计算三角函数的值的那张表),把这些预先就计算好了的值存储于计算机中,当你需要这个函数值时,直接去取就行了,当然这样的时间复杂度是O(1),因为你不需要任何计算,直接取出即可。(在计算机发明之前,事实上就是这样,类似于三角函数查表) 相对于其他再用别的算法来计算函数值的算法,它的时间复杂度是最好滴,它是最快滴。当然,你为时间最快付出了什么代价呢?空间!对,你需要一块空间来存储这些值,而其他的算法不需要或者需要的空间少得多。 这就是时间和空间的考量,有时候需要拿时间换取空间,有时候需要拿空间换取时间。在一些算法 阅读全文
posted @ 2011-06-25 00:19 jinmengzhe 阅读(1849) 评论(0) 推荐(0)
摘要: 变治法是指这样一组设计方法:它们都基于变换的思想。这些方法都分为两个阶段,变,把问题的实例变得更容易求解,治,在变的基础上对问题求解。3种变换方式:1)将问题变为一个更简单或方便的实例---实例化简(如预排序,高斯消去法)2)变换同样的实例为不同的表现---改变表现(AVL树,多路查找树)3)变换为另一个问题(这种问题的算法是已知的)的实例---问题化简(堆排序,其他等等,转化)------------------------------------------------------------------------------------------------------------- 阅读全文
posted @ 2011-06-21 13:48 jinmengzhe 阅读(4117) 评论(2) 推荐(2)
摘要: 前面3篇文章介绍了减治法的策略和思想,经典数据结构算法中的几个减治算法,排列,子集的减治算法。这些都是属于减一治的减治策略。这篇文章来介绍减常因子和减可变规模的减治策略算法,当然,规模递减的越快的算法也就越难找,所以这样的算法并不是很多。目前前面写过的减常因子的有折半查找(减常因子的减治策略的可以看做分治的变种,前面说过),减可变规模的减治策略有欧几里得最大公约数算法。------------------------------------------------------------------------------------------------------------------ 阅读全文
posted @ 2011-06-19 10:19 jinmengzhe 阅读(3321) 评论(0) 推荐(1)
摘要: 子集问题是指生成一个集合的全部子集(2^n个,包括空集和全集),今年实验室一个去高盛的同学在技术面中被问到了这个问题,另外记得还有一个快排的时间复杂度证明(这个更难,就算了,有时间去看看算法导论怎么证明的)算法1:减一治策略有了减治生成排列的经验,相信对于子集来说,用减治法来思考就更加简单了。如果有了n-1个元素的全部子集项{ 2^(n-1) 项},那么n个元素的全部子集首先包含这已经有的n-1个元素的全部子集,另外还包括把第n个元素加到每一个子集项里面去生成的子集项{ 也是2^(n-1) 项 },所以,正好这就有了2^(n-1) + 2^(n-1) = 2^n项,正是我们要的结果。为什么说它 阅读全文
posted @ 2011-06-17 23:29 jinmengzhe 阅读(2072) 评论(0) 推荐(3)
上一页 1 2 3 4 5 6 7 8 9 10 ··· 15 下一页