分治算法

第二章算法作业

家住魔仙堡 提交于 2019-12-01 10:36:18
1. 分治法的思想和体会: 分治,字面上的解释是 “分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。在计算机科学中, 分治法 就是运用分治思想的一种很重要的算法。分治法是很多高效算法的基础,如排序算法(快速排序,归并排序), 傅立叶变换 (快速傅立叶变换)等等。 顺带一提,我真的不会快速傅里叶变换。 用分治可以很有效地减少时间复杂度。 ——非常简单而且有效。 简单的分治还有很多很难的领域也可以用上,比如说傅里叶变换,比如说线段树。 线段树上的分治可以分为点分治和边分治。 总之 ……大概就是这样的感想了。 结对编程情况汇报 : 我就负责在旁边看我的队友敲代码。 只要想到了算法,并且算法是对的,然后按照算法将代码敲出来交上去 ——答案一定是对的。 不知道这个想法有没有传达给我的队友呢? 虽然我也很菜啦。 但是这个道理我还是懂的 —— 代码敲不出来也无所谓,最重要的是掌握算法以及思路。 因为代码以后肯定是能够敲出来的。 所以,一定要加油哦。 来源: https://www.cnblogs.com/lfh123123/p/11682015.html

分治法的思想与体会

点点圈 提交于 2019-12-01 08:26:37
分治法思想: 分治分治,即分而治之。分治,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。如图所示: 优缺点分析: 优点:用分治算法主定理可得时间复杂度为O(nlogn),相同元素的顺序不会颠倒,是稳定排序。 缺点:需要辅助数组,所需空间复杂度为O(n)。 分治法体会: 个人感觉类似于数学归纳法,找到解决本问题的求解方程公式,然后根据方程公式设计递归程序,在不限制空间大小的情况下挺好的。 结对编程的体会: 能认识各自的编程风格,彼此学习 来源: https://www.cnblogs.com/yingni/p/11673020.html

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

北战南征 提交于 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 06:58:05
众数问题 http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/3015/pid/1710.html Time Limit: 2000 ms Memory Limit: 65536 KiB Problem Description 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。对于给定的由n 个自然数组成的多重集S,计算S的众数及其重数。 如果出现多个众数,请输出最小的那个。 Input 输入数据的第1行是多重集S中元素个数n(n<1300000);接下来的n行中,每行有一个最多含有5位数字的自然数,。 Output 输出数据的第1行给出众数,第2行是重数。 Sample Input 6 1 2 2 2 3 5 Sample Output 2 3 解决思路: 使用数组Arr[i],其中i表示输入数据,Arr[i]表示i出现的个数。第一次循环输入并找出众数,而二次循环判断i,找到最小的。 注意事项: 因为 索引i 与 Arr[i] 之间存在对应关系,此时如果调用Sort[i] 会破坏这种对应关系。另一种解决方法是使用 Arr[t[i]],对t[i

第二章作业

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

CDQ分治(三维偏序)——学习笔记

ぐ巨炮叔叔 提交于 2019-12-01 05:23:07
目录 模板 例题 T1 T2 @(目录) 前不久学长讲了 \(CDQ\) 分治,当时只听懂了思想,没去管算法,下来自己看了下题解,发现很眼熟,原来自己过去就写过类似的算法,于是很快就学会了。 模板 模板题 经典的三维偏序:某个物体有三个属性 \(x,y,z\) ,求对于每个 \(i∈[1,n]\) ,存在的 \(j∈[1,n],j!=i\) 使得 \(x_i>=x_j且y_i>=y_j且z_i>=z_j\) 成立的个数。 偏序问题的常用解法 一维偏序:直接排序。 二维偏序:排序 \(+CDQ\) 分治(应该都求过逆序对吧,那就是二维偏序)or 排序+数据结构 三维偏序:排序 \(+CDQ\) 分治+数据结构 \(k\) 维偏序:排序 \(+CDQ\) 分治嵌套 三维偏序的实现方法:把三个属性存在一个结构体内,以其中一个为关键字对结构体排序,然后对第二维其进行CDQ分治,把第三维用数据结构进行维护,每次计算前一半对后一半的贡献。 \(CDQ\) 分治的思想类似于归并排序,写法也很相似,先将区间二分至最小,然后再合并,保证前后两半内部都是有序的,每次计算前一半对后一半的贡献。 想想归并排序求逆序对的时候,我们把原始的下标看做第一位,值看做第二维,我们在归并时,每次放入后一半区间内的数时,都计算一次前面已经放入前一半的数的个数,因为前一半的第一维一定小于后一半的第一维

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

我只是一个虾纸丫 提交于 2019-12-01 02:37:13
对分治法思想的体会:   简单来说分治法就是对一个规模大的问题进行分解,得到规模更小的若干个子问题,对子问题单独求解并合并子问题答案得到原问题答案的解决问题的思想。   其实分治法思想已在大一所学习的算法中有所体现,如二分搜索,但二分搜索规律简单,我并没有在其中体会到分治思想的妙处。但后来通过用分治思想解决求最大连续子段和、大整数的乘法运算、矩阵乘法、棋盘覆盖、线性时间选择等复杂问题时,我实在地体会到分治思想在解决有规律、大规模问题上的妙处。再者,归并排序、快速排序这些时间复杂度较低的排序方法也是运用了分治思想,可见分治思想的广泛运用。   对于使用者来说,可以结合对时间复杂度的考虑来决定是否该使用分治算法。如分治法能将二分搜索的时间复杂度降至O(logn),使求最大连续字段和的时间复杂度为O(nlogn),大整数乘法为O(n^1.59),而规避排序和快速排序的平均时间复杂度为O(nlogn)。   并不是所有的问题都适合用分治思想解决,由原问题分解得到的子问题必须能合并为原问题 的解才能使用分治法。如果分解得到的子问题不是相互独立的,使用分治法可能不能达到降低时间复杂度的目的。 结对编程的情况汇报:   就本次结对编程,我们在协作过程中发现双方的编程习惯和对题目的理解方式不同,在讲解自己的代码时不能让对方理解,还需时间磨合并加强沟通。进度较缓

分治算法体会

落爺英雄遲暮 提交于 2019-12-01 01:41:13
分治算法体会: 分治算法的概念: 所谓分治就是将一大问题,分解成一个一个小问题,而这些小问题的合并解得到局部问题的解,最后层层合并,最终得到问题的解。每个子问题都是相同的(解决思路是一致的),才能用分治; 分治有时候用于缩小所需查找的数值范围 常见的使用分治的算法: 归并排序 二分查找 最大字串和(也可以用动态规划) 何时使用: 分治的时间复杂度一般为:logn级,当题目中要求时间为logn,或者nlogn时间复杂度时,可以考虑使用分治。 来源: https://www.cnblogs.com/aresjohnson/p/11646248.html

算法分析之递归与分治策略

二次信任 提交于 2019-11-30 20:40:45
递归与分治策略 直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。 在计算机算法设计与分析中,使用递归技术往往使函数的定义和算法的描述简洁且易于理解。 例1 阶乘函数 可递归地定义为: 其中: n=0 时,n!=1为边界条件 n>0 时,n!=n(n-1)!为递归方程 边界条件与递归方程是递归函数的二个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。 例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为: 第n个Fibonacci数可递归地计算如下: int fibonacci(int n){ if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); } 递归需要有边界条件、递归前进段和递归返回段。 当边界条件不满足时,递归前进; 当边界条件满足时,递归返回。 注意:在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口,否则将无限进行下去(死锁)。 递归的缺点: 递归算法解题的运行效率较低。 在递归调用过程中,系统为每一层的返回点、局部变量等开辟了堆栈来存储。递归次数过多容易造成堆栈溢出等。 例3逆序输出一个正数中的每一位数 例如,对于数12345,依次输出5 4 3 2 1 分析:

查漏补缺·补丁计划

徘徊边缘 提交于 2019-11-30 16:21:36
趁着神志清醒赶紧写一下。 多次考试暴露出各种问题。新的知识点先不去搞了,最近多做一些不擅长的类型的题查漏补缺一下吧。 唔,首先是比较考验思维的类型,我智商太低又刷题少不会什么套路,只能最近赶紧赶一下进度…   1.DP,各种DP。斜率优化,树形DP,区间DP,状压DP,计数DP,背包,插头DP…   2.概率和期望问题。   3.其它数学问题,包括一些知识点的补全。 然后是一些基础性的或者模板性的我没有好好学或者没学的东西。   4.矩阵问题。尤其我还不会写矩阵乘……   5.STL。各种STL。   6.对拍。我还不会对拍…也没有转linux…   7.点分治。或者说分治问题,另外一个不太会的就是线段树上的分治。   8.各种字符串算法。各种自动机基本上忘得差不多了,以及后缀数组。kmp也再看一下。 接着各种复习,优先度稍低。   9.各种数据结构:平衡树splay和treap,LCT,kd-tree。哈希表算吗?对这个我居然也没怎么写过…   10.tarjan。   11.各种数学模板。lucas,exlucas,crt,欧拉函数和筛法,欧拉定理,斯特林数,卡特兰数。这都是学过还记得一些的,更多应该是上面的③的任务。 额外任务。   12.网络流。再学更多东西。   13.树套树。我不会,不知道这个优先度是不是应该再提一提。   14.反演。 就先这么多了其它能想起来再说