自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 资源 (1)
  • 收藏
  • 关注

原创 Dynamic Programming 求解GoldMineProblem

GoldMine问题其实就是路径选择问题,求解该问题有2中方法,方法1是通过greedy思想,根据当前每一步的最优解,但是只能得到局部最优解,得不到全局最优解;而方法2是通过DP思想从后往前推,假设前n-1步得到的就是n-1步上的最优解,则再加上第n步的最值则就是全局的最优解,所有DP思想可以精确求解全局最优解,这个好像不对,下面才是DP得到全局最优解的根本原因和效率高效的根本原因: 注:DP之所以能得到全局最优解的本质是它对每一种可能的方案都进行了计算,但相较于蛮力法求解...

2020-08-24 19:42:08 141

原创 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 186

原创 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 170

原创 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 179

原创 greedy策略求解工作选择问题物品剩余质量最大化(三)

该问题求解的是货物谁先生产的问题,由于生产完成的货物存在保质期,已完成的货物每存放一天,货物就会以一个固定的比例decay重量。且每个货物的生产时间都为一天。在所有货物生产完时,求解最终货物的最大重量。 由于是求解货物重量的最大化,所以该问题本身是一个优化问题,问题的最终目的是得到一个最优解,因此是否能够用greedy优化策略:既然是寻找最后剩余的最大货物质量...

2019-12-25 20:47:54 371

原创 greedy策略求解工作选择问题Loss最小化(二)

工作延时损失最小选择问题:每个工作包含工作耗时和延时损失2个属性,延时损失即该工作每延后一个小时开始做,则就损失一个loss值。注每个工作的耗时和延时损失各不相同。该问题类似于操作系统中的作业调度问题。 因此若每个工作的loss值都相同,则等价于作业调度问题,即耗时短的应当最先做,即最短最优调度算法。该算法的原理的greedy策略点是time,即当前工作耗时越短...

2019-12-23 11:11:08 319

原创 greedy算法计算金字塔分数问题

金字塔分数问题:将一个真分数拆分成数个分子为1的分数之和。 解决该问题的greedy方法是每次从剩余的部分选择一个分子为1的最大的分数,拆分成的金字塔所有数的特点是分母越来越大,形成一个金字塔的形状。 (1)如何每次从剩余的部分都能选择一个最大的分数,这个可以进行论证如下:证明:原真分数为a/b若接下来选择的一个分数为1/c,且1/c是最接...

2019-12-10 20:55:35 569

原创 分治递归法中时间复杂度的推理

时间复杂度的计算方法最直接的是count循环中语句执行的次数,如2个嵌套的for循环的时间复杂度就是当入参为n时,最大的循环执行为n2,但是其中执行的语句不只是一条,所以可能每次循环执行了c条,所以最终的循环执行次数为cn2;而时间复杂度的定义是小于等于(即大O定义),所以O(n2)≤cn2,Θ(n2)==cn2, Ω(n)>=cn2,(master定律)。 ...

2019-09-29 20:52:48 2479

原创 多项式相乘的高效分治算法一

多项式相乘最容易想到的方法就是采用2个for循环,依次遍历相乘累加即可。但时间复杂度为O(n2)。那么是否可用其他的方法来降低遍历比较的次数呢?可用分治法来进行对应切分,然后相乘,再相加。但是这好像并不能减少遍历的次数,因为与之前的合并排序不同的是,合并排序中,如果左边的数若比右边的数小,则左边的左边就不需要与右边的所有数进行比较,因为数是sorted,所以默认比右边的小,无需再比...

2019-09-20 16:37:44 2940

原创 分治法高效求解最邻近点对间的最短距离

2.1.5 ClosedShortestPoint 求平面内N个点中,相距最近的两个顶点之间的距离。(1)求解该问题,实际上就是比较其中每一个顶点与其他N-1个顶点之间的距离,然后比较计算出其中最短的距离。因此归根到底还是比较一堆数的大小,只不过多了一个数之间的计算。所以,可以想到能不能用分治法将所有点进行分割。(2)如果是一堆杂乱无章的点,杂乱无章的存储在vector中...

2019-08-26 20:38:51 1796

原创 逆序数对的分治思想求解方法

2.1.4 CountInversions 求一组数中的需要翻转的数的对数,其实就是求逆序对。 该问题最直接的方法,也是我最开始在leetcode上求解此题时,采用了2个嵌套的for循环进行比较即可,时间复杂度为O(n2),本质上是对一组数进行了遍历,在遍历的同时到底做了比较还是交换位置,都不影响遍历的这个过程。既然是遍历,我们可以采用快速排序和合并排序都是...

2019-08-09 19:54:13 606 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 2022

原创 基于分治法的合并排序高效求解算法

通过对算法的分析和问题的分析来引导如何去编程,一步步论证,检测,再论证去用程序来实现心中的想法。2.1.3 mergeSort 先分后治 分治法是采用分治思想来求解问题的一种思想,该思想在实际解决问题的过程中分为先治后分和先分后治两种情况。快速排序是先治后分的典型,而合并排序则是先分后治的典型。与快速排序相同的是合并排序也基于分治思想而想出来的一种排序算法;而与快速排序...

2019-08-02 09:51:36 380

原创 分治法实现快速排序算法

通过算法分析来引导如何通过代码来实现心中的想法,如何去写程序,实现算法。2.Advanced algorithm for solving2.1 divide and merge方法:分治法求解问题的思想是将问题中通过整体代入的思想将问题递归地分成小问题(即规模较小的原问题),并且每一次递归后都要进行合并操作,只有这样在递归结束后,分解的小问题的解就自动合并成最终的解...

2019-07-29 11:16:25 5361

原创 深入理解多项式求值的原理和意义

                                     多项式求值的原理和意义摘要:多项式是由多个单项(符号项如:5x或者常数项4)通过四则运算组合起来的式子,如P(x)=2x^4+3x^3-3x^2+5x-1  一般的求解会将特定的x代入到上式中,一个一个的计算,共需要花费10次的乘法和4次加法运算,但是我们可以通过霍纳方法对多项式进行组合计算,在需要每秒对多个不同输入的x多次...

2018-06-30 20:28:59 2776

原创 基于矩阵运算的高效搜索算法

注:本文是通过利用矩阵运算的基本原理,来实现高效的搜索。       目  录:一、矩阵运算的基本背景知识       1.1、矩阵的基本概念       1.2、矩阵的基本运算二、关于矩阵运算的应用     2.1、关于矩阵相乘来解决搜索问题的基本思想     2.2、具体运算实现过程三、实现算法如下四、实现结果

2017-05-26 16:19:18 2841

原创 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 244

原创 Dynamic Programming 求解数字三角形问题

NumberTriangle简称NT,是由正整数排列成三角形的形式。求从最上顶点到底边数字串成的路径上的最大路径长度,即路径上的数字和。非底边的每个数字都有2条子树路径(左子树和右子树)可供选择。 当然,可用最简单的方法将所有可能的路径全部遍历一遍,存储所有路径结果,然后比较得出最大的值,但时间复杂度为O(2n),而DP则减少一半(具体待验证)。观察NT可得,中间有些结果会被重复计算和使用,因此为了减少重复计算带来的不必要的时间消耗,最有效的方法是动态规划:后面的结果可以...

2020-06-09 21:22:52 154

原创 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 181

原创 greedy策略求解Huffman编码

Huffman编码的原理为:每次选择数据集datas中当前第1小和第2小的2个数来构建左右子树,而这2个子树的父节点则是这2个子树的和,然后将该和放入父节点的datas中,再在新的数据集中选择两个子树继续构建,直到数据集中只剩下一个数据为止。总共构建次数为n-1次。 而Huffman的greedy策略点为每次选择数据值倒数2个进行构建,因为Huffman的原则...

2020-01-13 20:06:43 368

原创 greedy策略求解工作选择问题(一)

工作选择问题是活动选择问题和背包问题的一个集成,因为背包问题的greedy思想是每次选择当前性价比最高的物品;同时活动选择问题的geedy思想不是选择价值最大的物品,而是根据具体的问题要求,即在所有活动结束前,一个人最多能完成多少个活动,所以活动选择问题的greedy思想是如果当前的活动能越早结束,则一个人将越能尽快的完成下一个活动,这样最后就能完成最多的活动,其中活动的结束时间和...

2019-12-18 10:15:38 377

原创 greedy策略求解活动选择问题 ActivitySelectProblem

活动选择问题:有N个活动,仅安排一个人去完成,求一个人在不限时的情况下最多能完成几个活动,要求:活动包含开始时间和结束时间,活动的时间点不能变,就是说到时了,到点的活动必须开始。 这个问题为什么能够用greedy思想来求解,一个最直接的想法就是:活动已经按照时间点计划好了,我要尽可能完成多的活动,那么当前活动如果能尽快结束,我就能尽快接着去完成下一个活动,反过来如果当...

2019-12-04 20:05:03 429

原创 greedy算法策略高效求解分数背包问题

通过greedy可以求解分数背包问题,其中编程的关键点是对物品按照其性价比进行排序,所以本文采用前面学到的高效的排序方法:基于分治思想的归并排序法进行排序。这样实现了高效的求解分数背包问题,具体求解思维过程如下: (1)通过greedy可以求解分数背包问题,其中编程的关键点是对物品按照其性价比进行排序,所以本文采用前面学到的高效的排序方法:基于分治思想的归...

2019-11-27 20:42:27 437

原创 排序算法分析与设计

       1.我们在实际的数据查询和搜索应用中,当寻找最小数或者最大数,或者中间的第K小的数时,首先的问题是对这个杂乱的数据进行排序,然后就可以快速定位到需要搜寻到的具体的数。那么怎么排序,如何进行快速的排序,是本文的研究和分析重点。其中我们从时间复杂度和空间复杂度进行推理和证明。      2.1首先映入眼帘的是插入排序:其排序的思想和方法实现较之前学习的冒泡和选择排序更加的容易理解...

2018-07-31 14:48:39 471

C++程序调试方法bug集

适用于了解和掌握在项目开发中经常遇到的C++中的bug,然后针对每一个bug 给出了有效的解决方法! 通过这个文档收集和积累所遇到不断出现的程序开发问题,为在程序开发的道路上扫清C++语言和bug的问题。

2018-06-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除