![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algorithm Theory Research and
大学摄影爱好者
这个作者很懒,什么都没留下…
展开
-
Dynamic Programming 求解GoldMineProblem
GoldMine问题其实就是路径选择问题,求解该问题有2中方法,方法1是通过greedy思想,根据当前每一步的最优解,但是只能得到局部最优解,得不到全局最优解;而方法2是通过DP思想从后往前推,假设前n-1步得到的就是n-1步上的最优解,则再加上第n步的最值则就是全局的最优解,所有DP思想可以精确求解全局最优解,这个好像不对,下面才是DP得到全局最优解的根本原因和效率高效的根本原因: 注:DP之所以能得到全局最优解的本质是它对每一种可能的方案都进行了计算,但相较于蛮力法求解...原创 2020-08-24 19:42:08 · 145 阅读 · 0 评论 -
Dynamic Programming求解Tiling Problem
TilingProblem就是在2×N的平面格式上铺设1×2或者2×1的平板方格,解决该问题的关键是将大平板划分成左右2个小平板,即左n/2列和右n-n/2列,再在小平板上进行左右递归划分组合,如果左右都划分好了。则在左右相邻的4个方格组成1种中部的横向排列组合,然后排除这4个方格,以再左n/2-1和再右的n-n/2-1的排列相乘得到新的排列组合数,最后加上左n/2和右n-n/2的组合乘积,递推式如下: f(n)=f(n/2)*f(n-n/2)+f(n/2-1)*f(n...原创 2020-08-17 19:27:21 · 252 阅读 · 0 评论 -
Dynamic Programming 求解第n个Bell数
Bell数等价于第二类斯特林数,主要用于求集合划分问题:求将1到n个数划分成子集的数量,且子集之间无交集。 根据Stirling组合原理可递推出Bell数的递推表达式,即从后往前推:假设已知第n-1个Bell数,那么第n个Bell数就是将第n个数插入到前面排好列的n-1个数的m个子集中;或者第n个数独立成一个堆,与前面将n-1个数划分成m-1堆共同构成n个数划分m个集合。因此:递推式为:B(n,m)=m*B(n-1,m)+B(n-1,m-1) 其中m*B(n-1,m)是插入...原创 2020-08-10 20:19:05 · 200 阅读 · 0 评论 -
Dynamic Programming 求解Catalan数中第n项的值
Catalan是一个组合数列,即一组情景下排列的组合数,前k次操作,后k个操作,前k次操作必须在后k次操作之前完成,注2k次操作可相互交叉。 递推式:f(n+1)=∑f(i)*f(n-i) ,i∈[0,n] 即:f(n)=∑f(i)*f(n-1-i),i∈[0,n-1] f(0)=1; n = 0, 1,2, 3, 4, 5, 6, 7, 8, 9 ...原创 2020-07-22 20:18:32 · 174 阅读 · 0 评论 -
Dynamic Programming 求解Fibonacci中的第i项的值
求Fibonacci数列的第i个数,最直接方法是直接根据Fibonacci的Formulating a relation among the states,即前后状态关系方程,编码递归函数实现,注意递归的终止条件是当自身传进来的参数n==1或者0时,就return 1或者0,若不是,则继续执行调用下面的本身函数进行递归调用。但其时间复杂度是指数级别:T(n)=T(n-1)+T(n-2),请问,根据该公式如何计算递归的时间复杂度? 那么,如何提高计算效率了?我们观察...原创 2020-07-01 21:08:04 · 184 阅读 · 0 评论 -
Dynamic Programming 求解数字三角形问题
NumberTriangle简称NT,是由正整数排列成三角形的形式。求从最上顶点到底边数字串成的路径上的最大路径长度,即路径上的数字和。非底边的每个数字都有2条子树路径(左子树和右子树)可供选择。 当然,可用最简单的方法将所有可能的路径全部遍历一遍,存储所有路径结果,然后比较得出最大的值,但时间复杂度为O(2n),而DP则减少一半(具体待验证)。观察NT可得,中间有些结果会被重复计算和使用,因此为了减少重复计算带来的不必要的时间消耗,最有效的方法是动态规划:后面的结果可以...原创 2020-06-09 21:22:52 · 157 阅读 · 0 评论 -
Dynamic Programming 计算第N个guly数
求正整数中第n个guly数,guly数是因式分解后,所有的因子最终必须是2、3或5的倍数。仅通过数学方法计算判断一个数是否是guly数,比较简单,但是为什么第n个guly数的求解是采用了dynamic programming思想呢? Dynamic Programming下文简称DP,其思想的核心和问题的分辨是:后面的解答是前面解答的累加或累乘。 既然如此:我们再来看一看问题,guly序列当中,任意一个guly数必须是2||3|...原创 2020-06-05 20:24:05 · 183 阅读 · 0 评论 -
greedy算法策略高效求解分数背包问题
通过greedy可以求解分数背包问题,其中编程的关键点是对物品按照其性价比进行排序,所以本文采用前面学到的高效的排序方法:基于分治思想的归并排序法进行排序。这样实现了高效的求解分数背包问题,具体求解思维过程如下: (1)通过greedy可以求解分数背包问题,其中编程的关键点是对物品按照其性价比进行排序,所以本文采用前面学到的高效的排序方法:基于分治思想的归...原创 2019-11-27 20:42:27 · 443 阅读 · 0 评论 -
分治递归法中时间复杂度的推理
时间复杂度的计算方法最直接的是count循环中语句执行的次数,如2个嵌套的for循环的时间复杂度就是当入参为n时,最大的循环执行为n2,但是其中执行的语句不只是一条,所以可能每次循环执行了c条,所以最终的循环执行次数为cn2;而时间复杂度的定义是小于等于(即大O定义),所以O(n2)≤cn2,Θ(n2)==cn2, Ω(n)>=cn2,(master定律)。 ...原创 2019-09-29 20:52:48 · 2544 阅读 · 0 评论 -
多项式相乘的高效分治算法一
多项式相乘最容易想到的方法就是采用2个for循环,依次遍历相乘累加即可。但时间复杂度为O(n2)。那么是否可用其他的方法来降低遍历比较的次数呢?可用分治法来进行对应切分,然后相乘,再相加。但是这好像并不能减少遍历的次数,因为与之前的合并排序不同的是,合并排序中,如果左边的数若比右边的数小,则左边的左边就不需要与右边的所有数进行比较,因为数是sorted,所以默认比右边的小,无需再比...原创 2019-09-20 16:37:44 · 3022 阅读 · 0 评论 -
分治法高效求解最邻近点对间的最短距离
2.1.5 ClosedShortestPoint 求平面内N个点中,相距最近的两个顶点之间的距离。(1)求解该问题,实际上就是比较其中每一个顶点与其他N-1个顶点之间的距离,然后比较计算出其中最短的距离。因此归根到底还是比较一堆数的大小,只不过多了一个数之间的计算。所以,可以想到能不能用分治法将所有点进行分割。(2)如果是一堆杂乱无章的点,杂乱无章的存储在vector中...原创 2019-08-26 20:38:51 · 1857 阅读 · 0 评论 -
逆序数对的分治思想求解方法
2.1.4 CountInversions 求一组数中的需要翻转的数的对数,其实就是求逆序对。 该问题最直接的方法,也是我最开始在leetcode上求解此题时,采用了2个嵌套的for循环进行比较即可,时间复杂度为O(n2),本质上是对一组数进行了遍历,在遍历的同时到底做了比较还是交换位置,都不影响遍历的这个过程。既然是遍历,我们可以采用快速排序和合并排序都是...原创 2019-08-09 19:54:13 · 634 阅读 · 1 评论 -
分治法高效求解Tile贴L型瓷砖问题
2.1.3 TileBoard TileBoard是一种通过分治思想对平面进行分割,对一个N*N的格子的平面贴上L型瓷砖的算法,注意N为2的幂数,其中有一个空缺基本方格是不需要贴的,L型瓷砖是3个基本方格组成的。 为什么这个问题可用分治法呢?假设N=8,那么就有64个基本方格,那么如果随意贴L型瓷砖,你会发现最后贴不下去,最后剩下3个基本方格没有连在一起,其实就...原创 2019-08-07 12:19:32 · 2102 阅读 · 0 评论 -
基于分治法的合并排序高效求解算法
通过对算法的分析和问题的分析来引导如何去编程,一步步论证,检测,再论证去用程序来实现心中的想法。2.1.3 mergeSort 先分后治 分治法是采用分治思想来求解问题的一种思想,该思想在实际解决问题的过程中分为先治后分和先分后治两种情况。快速排序是先治后分的典型,而合并排序则是先分后治的典型。与快速排序相同的是合并排序也基于分治思想而想出来的一种排序算法;而与快速排序...原创 2019-08-02 09:51:36 · 386 阅读 · 0 评论 -
分治法实现快速排序算法
通过算法分析来引导如何通过代码来实现心中的想法,如何去写程序,实现算法。2.Advanced algorithm for solving2.1 divide and merge方法:分治法求解问题的思想是将问题中通过整体代入的思想将问题递归地分成小问题(即规模较小的原问题),并且每一次递归后都要进行合并操作,只有这样在递归结束后,分解的小问题的解就自动合并成最终的解...原创 2019-07-29 11:16:25 · 5464 阅读 · 0 评论 -
排序算法分析与设计
1.我们在实际的数据查询和搜索应用中,当寻找最小数或者最大数,或者中间的第K小的数时,首先的问题是对这个杂乱的数据进行排序,然后就可以快速定位到需要搜寻到的具体的数。那么怎么排序,如何进行快速的排序,是本文的研究和分析重点。其中我们从时间复杂度和空间复杂度进行推理和证明。 2.1首先映入眼帘的是插入排序:其排序的思想和方法实现较之前学习的冒泡和选择排序更加的容易理解...原创 2018-07-31 14:48:39 · 484 阅读 · 0 评论