递归算法

算法第二章总结

一个人想着一个人 提交于 2019-12-01 08:44:11
第二章总结:对分治法思想的体会与结对编程情况汇报 一、分治法思想的学习体会 1. 分治法,照着书本的解释,分而治之的思想,把一个难以解决的较大的问题,拆分成一些规模小的相同问题,然后把这些小规模的问题逐个解决,大的问题自然就解决了。按我的理解,就是比如说一个公司的管理,大的问题就是整个公司的管理问题,如果说拆分为每个部门的管理,每个部门的管理都做好了,整个公司,也就是大的问题就解决了,这就是分治法的思想。运用于编程上,就比如快速排序算法,只需要找出每次数字移动的规律,再运用递归的方式,即可完成。 2. 学会分治法,便可以把复杂的问题简单化,这是一种能力,一种对复杂问题的分析能力。看到一个复杂的问题,可以先分析下,是否可以拆分成多个小规模相同的问题,然后逐个击破,最后解决难题。分治法可以降低时间复杂度,提高运行的效率,也方便他人理解算法思想。 二、结对编程情况汇报 上次实验课的上机,很久没有实验室打代码了,第一次体验结对编程。和伙伴一起看题做题,学会了递归法,所以一看到第一题是二分搜索就直接用了递归法做,但因为题目的特殊限制,需要统计比较次数,一直卡在这卡了很久,询问别人,发现大家很多都是用迭代法做。最后选择先做第二题,是二分搜索的改进,依旧用递归法,成功了。最后没有时间做第三题。两题都用了递归的思想,感受到了分治法的魅力,使得问题简单化。关于第一题,最后我们尝试了迭代法,也还是出错

算法第二章递归与分治策略小结

北战南征 提交于 2019-12-01 08:03:22
第2章 递归与分治策略 2.1.递归的概念 递归算法:直接或间接地调用自身的算法 递归函数:用函数自身给出定义的函数 !!!!递归函数的第一句一定是if语句作为边界条件,然后就是递归方程 如:阶乘函数的第一句就是if条件语句 1 int factorial(int n){ 2 if( n ==0) 3 return 1; 4 return n*factorial(n-1); 5 } ※※※递归函数中比较著名的是Hanoi塔问题 Hanoi塔问题。 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座c上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足规则1和2的前提下,可将圆盘移至a,b,c中任一塔座上。 hanoi塔问题题目描述 1 #include<iostream> 2 using namespace std; 3 void move(char p1,char p2){ 4 cout<<p1<<"->"<<p2<<endl; 5 } 6 7 //将a上的n个盘子经b移动到c上 8 void hanoi(int n,char a,char b,char

对分治法思想的体会 & 结对编程情况汇报

喜夏-厌秋 提交于 2019-12-01 07:54:55
一、对分治思想的体会 1、帮助我们解决问题。 分治法,对大的问题拆封成规模较小的问题,我们求解小问题,再把小问题的答案合并起来,得出大问题的答案。大问题思考起来比较乱,犯迷糊,不易想到解决方法,比如汉诺塔问题。分解成小问题,我们就容易想出方法来解决问题 2、时间复杂度低 分治法思想核心是递归,递归的时间复杂度低。算法的复杂度低,提高了算法的质量 二、结对编程情况汇报 3道题都做完且答案正确,第三道题,没有按时间复杂度为O(logn)编程,后来查找资料知道如何写出O(logn)的算法。第一题,开始没有语法错误,但是答案不正确,因为没有用多几个不同特殊的例子去检验答案的正确性。 第二题是在第一道题基础上的修改,所以思路有了,想清楚两道题的不同点后,比较快速的做出来。 来源: https://www.cnblogs.com/666AAAA/p/11670987.html

正确重写hashCode方法

廉价感情. 提交于 2019-12-01 07:47:05
https://blog.csdn.net/HD243608836/article/details/87367763 到这里,对象写完了,开始描述问题。 计算hashCode的注意事项: 1、不能包含equals方法中没有的字段,否则会导致相等的对象可能会有不同的哈希值。 (即对类中每一个重要字段,也就是影响对象的值的字段,也就是equals方法里有比较的字段,进行操作) 2、String对象和Bigdecimal对象已经重写了hashcode方法,这些类型的值可以直接用于重写hashcode方法; 3、result = 31 *result + (dishCode !=null ?dishCode.hashCode() : 0);,这里面为啥用个31来计算,而且很多人都是这么写的,这是因为31是个神奇的数字,任何数n*31都可以被jvm优化为(n<<5)-n,移位和减法的操作效率比乘法的操作效率高很多! 4、 Google 首席Java架构师Joshua Bloch在他的著作《Effective Java》中提出了一种简单通用的hashCode算法: ①初始化一个整形变量,为此变量赋予一个非零的常数值,比如int result = 17; ②如果是对象应用(例如有String类型的字段),如果equals方法中采取递归调用的比较方式

二叉树算法练习递归类型汇总

谁说我不能喝 提交于 2019-12-01 07:24:25
递归类型 按照编程技巧分啪 一、将复杂问题分解成两个子问题 1、平衡二叉树( LeetCode题库110题 ) 自上而下 :算每个节点的平衡因子(即左右子树的高度差),判断是否满足条件。 可以分成两个子问题:求树的高度,和遍历树判断每个节点的是否满足条件 class Solution { public boolean isBalanced(TreeNode root) { if(root == null) { return true; }else { //判断根结点是否满足平衡因子 int ldepth = depth(root.left); int rdepth = depth(root.right); System.out.println(ldepth + " " + rdepth); if(Math.abs(ldepth - rdepth) > 1) { return false; } //判断左子树是否满足平衡因子 if(!isBalanced(root.left)) { return false; } //判断右子树是否满足平衡因子 if(!isBalanced(root.right)) { return false; } return true; } } private int depth(TreeNode root) { int l = 0; int r = 0;

递归

寵の児 提交于 2019-12-01 07:20:15
一、递归问题模板 先解决剩余问题,在缩小规模 function recursion(大规模){ if (end_condition){ // 明确的递归终止条件 end; // 简单情景 }else{ // 在将问题转换为子问题的每一步,解决该步中剩余部分的问题 solve; // 递去 recursion(小规模); // 递到最深处后,不断地归来 } } 先缩小规模,在解决剩余问题。 function recursion(大规模){ if (end_condition){ // 明确的递归终止条件 end; // 简单情景 }else{ // 先将问题全部描述展开,再由尽头“返回”依次解决每步中剩余部分的问题 recursion(小规模); // 递去 solve; // 归来 } } 这两个模板都是要根据具体的问题,才可以做出选择。 二、递归典型问题 1、阶乘问题 //阶乘问题 public class Demo1 { //递归方法 static int f1(int n) { //[1]找到递归的出口 if(n== 1) { return 1; } //[2]求解剩余步 //[3]缩小问题规模 return n*f1(n-1); } //循环 static int f2(int n) { int result = 1; while(n > 0) { result =

第二章算法总结

孤者浪人 提交于 2019-12-01 07:15:50
递归的概念:直接或者间接地调用自身的算法称为递归算法。 递归让一些复杂的问题变得简单易懂易于分析,如汉诺塔问题和Ackerman函数,在排序快排算法和归并排序算法中也有递归的运用。 汉诺塔: ackerman函数: 递归的缺点:需要不断开拓堆栈空间,占用空间大,可能导致内存溢出,并且运行效率低,不能记录已经计算过的结果,和动态规划比速度慢。 分治法的基本思想: 分治法将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归地解决这些子问题,然后将各个子问题的解合并得到原问题的解 一般的设算法设计模式 void 分支法(P问题){   设置问题边界   if(P 小于等于最小问题规模)     调用解决最小规模的方法   将P问题分成k分   for( i : 1 -> k) {     yi = 分支法(pi)   }   return 合并(y1 -> yk) } 分治算法复杂度分析:https://www.cnblogs.com/MarcusJr19/p/11661392.html (以获得作者同意进行转载) 补充 T(n) = aT(n/b) + O(n^d) a:分成a个子问题 b:将问题规模变为n/b d:分解和合并a个子问题的时间复杂度为O(n^d) 分治法的核心是找到与原问题相同的子问题

第二章作业

戏子无情 提交于 2019-12-01 05:42:48
1. 请谈一下你对分治思想的体会 分治法将一个规模为 n 的问题分解为 k 个规模较小的子问题,这些子问题互相独立且与原问题相同。递归解决子问题,最后再将子问题的解合并得到原问题的解( divide-conquer-merge )。使问题简单化,程序的时间复杂度降低,解决问题的效率也就提高。在实践中,递归与分治相结合的算法确实能比较高效的解决问题,如归并排序。 2. 结队编程情况汇报 我觉得结队编程是取长补短的做法,一个人复述代码如何实现并查找错误,另一个着手打代码;看代码能力以及打代码能力都能得到提高,也可分享各自思路。对于我,能学习挺多的。 来源: https://www.cnblogs.com/liuyuany/p/11660886.html

条件随机场CRF原理介绍 以及Keras实现

夙愿已清 提交于 2019-12-01 05:35:44
本文是对CRF基本原理的一个简明的介绍。当然,“简明”是相对而言中,要想真的弄清楚CRF,免不了要提及一些公式,如果只关心调用的读者,可以直接移到文末。 图示 # 按照之前的思路,我们依旧来对比一下普通的逐帧softmax和CRF的异同。 逐帧softmax # CRF主要用于序列标注问题,可以简单理解为是 给序列中的每一帧都进行分类 ,既然是分类,很自然想到将这个序列用CNN或者RNN进行编码后,接一个全连接层用softmax激活,如下图所示 逐帧softmax并没有直接考虑输出的上下文关联 条件随机场 # 然而,当我们设计标签时,比如用s、b、m、e的4个标签来做字标注法的分词,目标输出序列本身会带有一些上下文关联,比如s后面就不能接m和e,等等。逐标签softmax并没有考虑这种输出层面的上下文关联,所以它意味着把这些关联放到了编码层面,希望模型能自己学到这些内容,但有时候会“强模型所难”。 而CRF则更直接一点,它 将输出层面的关联分离了出来 ,这使得模型在学习上更为“从容”: CRF在输出端显式地考虑了上下文关联 数学 # 当然,如果仅仅是引入输出的关联,还不仅仅是CRF的全部,CRF的真正精巧的地方,是它 以路径为单位,考虑的是路径的概率 。 模型概要 # 假如一个输入有 n n 帧,每一帧的标签有 k k 种可能性,那么理论上就有 k n kn 中不同的输出

第二章作业

我的未来我决定 提交于 2019-12-01 05:05:25
1,对分治法思想的体会   分治法就是将一个规模大的问题分解成n个规模较小的相同子问题,然后再递归求解这些问题,从而降低算法的时间复杂度。这是一个很好用的思想,可以简化很多的问题。不过正因为它是递归,所以它不能达到最佳。虽然如此,但它也还是可以让我们在解题中多几种方法,多点思路去解决一个问题。这让我受益良多。 2.结对编程情况汇报   我和我的队友在这次结对中学到了很多,比如分工合作。两个人有意识地去配合,让整个工作变得简单。他编写的第一道代码给了我很多灵感,让我去改进代码,去解决第二道题。在检验代码的时候,他又提出很多建设性的意见,直接了当地指出我算法没考虑周全的地方。之后我们也时常一起打代码,一起写程序。当程序完全通过时,那种成就感满溢整个大脑。写代码,学算法的路上还有很长,我相信我们两个一定一起解决问题,克服难关,学好算法。 来源: https://www.cnblogs.com/chenyuqi32-2-11/p/11657350.html