首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

算法之路(一)----求最大子序列

优秀的算法甚至能给人amazing的感觉。 今天记录《数据结构与算法分析------C语言描述》中的一个求最大子序列的问题。...后面会给出实际的运行时间,还是先分析和记录算法吧。 算法1 算法1是穷举式的尝试所有的可能,用三重嵌套for循环来求解最大子序列,但是运行的时间非常慢,时间复杂度是O(NNN),即N的立方。...3 算法3采用一种分治策略。...该算法需要有一些分析: 在例子中,最大子序列和可能出现在三处。数据的左半部分,数据的右半部分,或者跨越数据的中部,左右两半部分各占一些。前两种情况可以用递归求解。...分析:该算法首先定义两个变量,maxSum用来记录当前求出的最大子序列和,subSum用来记录遍历的元素中非零和。

50030

大子序列和问题之算法优化

算法三:分治(divide-and-conquer)策略 分治策略: 分:把问题分成若干个(通常是两个)规模相当的子问题,然后递归地对它们求解。...在这个问题中,最大子序列和可能在三处出现:即左半部序列、右半部序列、穿过中部从而占据左右两半部分的序列。前两种情况可以通过递归求解。...故该序列的最大子序列和为max(6,4,0)= 6。 时间复杂度分析: 假设T(n)为求解大小为n的最大子序列和问题所花费的时间。...综上可列如下方程组: T(1) = 1 T(n) = 2T(n/2) + O(n) 事实上,上述方程组常常通用于分治算法,由方程组可算出T(n) = O(nlogn)。...算法四: 算法三利用递归较好的解决了最大子序列和问题,但仔细分析,在递归过程中,同一个元素很可能多次被操作,有没有更高效的算法?先上代码!

1.1K70

大子序列和问题之算法优化

---- 算法三:分治(divide-and-conquer)策略 分治策略: 分:把问题分成若干个(通常是两个)规模相当的子问题,然后递归地对它们求解。...在这个问题中,最大子序列和可能在三处出现:即左半部序列、右半部序列、穿过中部从而占据左右两半部分的序列。前两种情况可以通过递归求解。...故该序列的最大子序列和为max(6,4,0)= 6。 时间复杂度分析: 假设T(n)为求解大小为n的最大子序列和问题所花费的时间。...综上可列如下方程组: T(1) = 1 T(n) = 2T(n/2) + O(n) 事实上,上述方程组常常通用于分治算法,由方程组可算出T(n) = O(nlogn)。...---- 算法四: 算法三利用递归较好的解决了最大子序列和问题,但仔细分析,在递归过程中,同一个元素很可能多次被操作,有没有更高效的算法

71830

分治法解决最大子数组问题

输入:测试数组1, -2, 3, 10, -4, 7, 2, -5; 输出:最大子数组为3, 10, -4, 7, 2;    输出最大子数组的和为18 。...1.蛮力法求解 总体思路:   蛮力法是简单的实现方法,只要列出数组所有可能的组合,然后找出其中和最大的组合即可;   蛮力法分三层循环实现:     1)第一层循环用于固定子数组的起始位置;     ..._max=sum; 20 } 21 } 22 } 23 return _max;//返回最大和 24 } 2.分治法求解...总体思路:   分治法的精髓:     1)分--将问题分解为规模更小的子问题;     2)治--将这些规模更小的子问题逐个击破;     3)合--将已解决的子问题合并,最终得出“母”问题的解;...  所以原数组的最大子数组求法:     1)分--将原数组拆分成两部分,每个部分再拆分成新的两部分......直到数组被分得只剩下一个元素;     2)治--每个小型的数组找最大子数组,只有一个元素的数组

1.2K30

大子序列

零、前言 最大子序列和问题 这个问题是《数据结构和算法分析》一书中的一个问题,书中给了四种算法 我感觉它是入手算法很不错的一个问题,本文算法源于书中,但文中包含了我的分析和理解 2.题目的分析 也许很多人看到题目就懵圈了...i=0,j=4 时:sum= sum + -5 即 -2+11-4+13-5,然后维护maxSum 这样就减少一层for循环:时间复杂度为O(N^2) 三、第三种算法 1.具体算法 分治的思想,也是本文最想讲的内容...center; i >= start; i--) {//遍历包含center点的侧子序列取最大和 leftBorderSum += a[i]; if (leftBorderSum >...,也很难去说明这个算法的正确性 这在O(N)的时间完成了最大子序列和问题,这种"简洁和聪明以及高效"也许就是算法的迷人之处。...O(N^3)优化到O(N^2),再用分治优化到O(NlogN) 最后被一个O(N)的算法亮瞎的的钛合金言,所以这个问题真的挺有意思。

42330

算法分治

分治 分治是一种将大问题分解成相同任务的小问题的方法,常见的分治思想之一就是归并排序(mergeSort) 归并排序 归并排序在之前的排序章节中有讲解过,这里再回顾一下: 给定一个无序列表: 从中间将其分为左右两个子列表...,因此可以分治的基于左右有序列表构造左右子树; 代码实现: python实现 # Definition for a binary tree node. # class TreeNode: # def...示例 1: 输入:[3,2,3] 输出:3 示例 2: 输入:[2,2,1,1,1,2,2] 输出:2 进阶: 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。...经典的分治算法递归求解,直到所有的子问题都是长度为 1 的数组。长度为 1 的子数组中唯一的数显然是众数,直接返回即可。如果回溯后某区间的长度大于 1,我们必须将左右子区间的值合并。...inorder 保证 为二叉树的中序遍历序列 解题思路: 与之前的中序遍历和后续遍历一样,先找到根节点,然后将其分为左子树和右子树,分治递归的构建左子树和右子树 前序遍历的顺序:先根节点->左子树->

96930

有趣的算法(十一) ——分治法:快速​求

有趣的算法(十一)——分治法:快速求值 (原创内容,转载请注明来源,谢谢) 一、需求 一个数组,里面有若干的数字,现需要得到这一组数字的最大值和最小值。...二、简单分析 最基本的做法,是两两比对,可以区分出临时的最大值和最小值,再拿临时的最大值和最小值往后比较,有新的值则更新。总的需要的比较次数是2n-2。 三、优化 使用分治法快速求值。...即把数组分到最小的1-2个数,两两比较后,仅将最大值和最小值回传,再两两比较值,回传新的值,最终得出最大值和最小值。 分析需要比较的次数。当数组只有1个数时,T(1)=0;2个数时,T(2)=1。...当n不是2k,则次数会比3n/2-2略多,正好2的k次的数组长度时,这种算法较快。 四、实现 使用php编程,代码如下: <?...php $x = 0; //快速求值-返回 array(min, max) function quickMost(array $nums) { $len = count($nums)

1.5K120

分治算法

主要思想 分治算法的主要思想是将原问题递归地分成若干个子问题,直到子问题满足边界条件,停止递归。将子问题逐个击破(一般是同种方法),将已经解决的子问题合并,最后,算法会层层合并得到原问题的答案。...分治算法的步骤 分:递归地将问题分解为各个的子问题(性质相同的、相互独立的子问题); 治:将这些规模更小的子问题逐个击破; 合:将已解决的子问题逐层合并,最终得出原问题的解; 分治法适用的情况 原问题的计算复杂度随着问题的规模的增加而增加...算法应用 leetcode 169题: 解题思路: 1. 定义递归终止条件 2....max_right = self.maxSubArray(nums[len(nums) // 2:len(nums)]) #计算中间的最大子序和,从右到左计算左边的最大子序和...,从左到右计算右边的最大子序和,再相加 max_l = nums[len(nums) // 2 - 1] print(max_l,nums) tmp =

45640

顺序表应用7:最大子段和之分治递归法------分治思想

顺序表应用7:最大子段和之分治递归法 Description 给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1...例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。...注意:本题目要求用分治递归法求解,除了需要输出最大子段和的值之外,还需要输出求得该结果所需的递归调用总次数。...n==1)||(n==0)) return 1; else s=fib(n-1)+fib(n-2); return s; } Input 第一行输入整数n(1<=n<=50000),表示整数序列中的数据元素个数...Output 一行输出两个整数,之间以空格间隔输出: 第一个整数为所求的最大子段和; 第二个整数为用分治递归法求解最大子段和时,递归函数被调用的总次数。

20020
领券