
算法基础
clearlove推理能手
。。。
展开
-
分治策略之矩阵乘法的几种实现
欢迎关注,定期更新算法问题今天介绍一下分治算法的一个典型例子——矩阵乘法如果以前了解过矩阵,应该知道矩阵的乘法公式C(m,n)=A(m,k)*B(k,n),在这里我们只讨论方阵,假设A是n*n阶,B也是n*n阶,那么要计算乘积需要进行n^2个元素,看《算法导论》给出的伪码:上边这个过程进行三次循环,每次循环执行n步,故花费时间是O(n^3),下边是代码实现:void原创 2017-10-27 21:58:50 · 6733 阅读 · 2 评论 -
分治策略之最大子数组问题
欢迎关注,定期更新算法问题今天介绍一下分治算法的一个典型问题----最大子数组问题先来看一下《算法导论》上的一个引例,对于这个问题,我们常规的思维就是在股价最低时买进,股价最高时抛出,只要满足买进的时间在卖出的时间之前,就可以达到我们所认为的最大效益;但是情况有可能不是这样的,例如下边这个图,同样是《算法导论》上的插图:通过这个图明显的看出,效益最大化的时间原创 2017-10-26 17:16:20 · 553 阅读 · 0 评论 -
动态规划之钢条切割问题
欢迎关注,定期更新算法问题!这一篇来讨论一下关于动态规划的一些问题。动态规划和分治方法类似,都是组合子问题的解来求解原问题,但是两者不同的是分治方法将问题化为互不相交的子问题,递归的求解子问题,再将子问题的解组合起来求解原问题;而动态规划应用于子问题重叠的情况,即不同的子问题有公共的子子问题。所以在这种情况下,分治方法会重复计算那些公共子问题,但是动态规划对公共子问题只求解一次。动态规原创 2017-10-30 21:46:11 · 542 阅读 · 0 评论 -
动态规划之矩阵链乘法
上一篇介绍了动态规划的基本概念,又介绍了一个典型的例子链条分割,这一篇来介绍另一个例子-----矩阵链乘法给定一个n个矩阵的序列,我们希望计算它的乘积 A1A2A3...An,我们可以用括号标定计算次序,然后再利用标准的矩阵乘法算法来计算,由于矩阵乘法满足结合律,所以任何一种计算顺序最后的计算结果都是相同的。完全括号化的矩阵乘积链:它是单一矩阵,或者两个完全括号化的矩阵乘积链的积,并且已经原创 2017-10-31 21:31:39 · 729 阅读 · 0 评论 -
简单的归并排序
第一篇归并排序就是一种分治法的思想,通过递归调用自身函数将原问题划分为其子问题,再求解子问题,然后将子问题合并的过程。例如有序列{5,2,4,7,6,9,1,0},第一次调用划分为{5,2,4,7}和{6,9,1,0}两个堆,第二次调用划分为{5,2},{4,7},{6,9},{1,0}4个堆,第三次调用划分为{5},{2},{4},{7},{6},{9},{1},{0},到这一步划分结束原创 2017-10-25 11:00:02 · 641 阅读 · 0 评论 -
简单的插入排序
第二篇简单的插入排序算法的实现,以下的源码都是基于数组实现的,等学习了数据结构之后,再实现基于其他结构的。插入排序是一种相对比较广泛的排序算法,基本思想就是将一个数插入到已经有序的序列中,时间复杂度为O(n^2),由于其为稳定的排序算法,所以当数据量较小时应用较广。例如下边这个序列:’实现起来比较简单,源码如下:(1)、内部用while循环void InsertSo原创 2017-10-25 18:05:36 · 605 阅读 · 0 评论 -
动态规划之最长公共子序列
先来看一下基本概念1、公共子序列:给定两个序列X和Y,如果Z既是X的子序列,又是Y的子序列,那么称Z是X和Y的公共子序列。2、最长公共子序列:求公共子序列中长度最长的。最长公共子序列问题,简称LCS问题,下边说一下求解思路:步骤一:刻画最长公共子序列的特征:前缀:给定一个序列X={x1,x2,x3...xm},对于i=1...m,定义X的第i前缀Xi={x1,x2,..xi};原创 2017-11-04 15:57:35 · 280 阅读 · 0 评论 -
贪心算法之活动选择问题
这一篇开始简单的介绍下贪心算法。在求解最优化问题的过程中,每一步我们都面临着很多选择,当然动态规划是最主要和最有用的算法,但是对于一些问题来说,可以选用更高效的算法,比如贪心算法,贪心算法就是每一步在当时都做出最佳的选择,也就是它总是做出局部最优解,然后寄希望这样的操作能找到全局自由解。贪心算法不一定能找到全局最优解,但对大多数问题来说能找到最优解。先来看第一个问题--------活动选择原创 2017-11-05 16:22:01 · 628 阅读 · 0 评论 -
二叉树mirros遍历和数组划分为k等份
1、二叉树mirros遍历,原理类似于线索树,利用空余指针来保存其后续节点。void recoverTree(struct TreeNode* root) {/**中序mirros'遍历**/ if (root == NULL) { return; } struct TreeNode *p1 = root; struct TreeNode *p2 = NULL; ...原创 2019-04-20 17:18:56 · 737 阅读 · 0 评论