alg--分治法
分治--分而治之, 把大的问题分成n个小的问题,分别处理,然后汇总小问题的结果。
具体介绍可以参考这位大哥的blog:
https://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html
思考的地方,分治是思想还是算法,递归是思想还是什么??
-- 个人理解分治是算法的思想,递归是一种实现的思想吧
example:
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 一般解法:
int maxSubArray(int* nums, int numsSize) {
int i = ;
int j = ;
int iSum = ;
int iMax = nums[]; for (; i < numsSize; iSum = , i++)
{
for (j = i; j< numsSize; j++)
{
iSum += nums[j];
if (iMax < iSum) iMax = iSum;
}
}
return iMax;
}
分治解法:
#define MAX_INT(a, b) ((a > b) ? a : b)
int GetMidMax(int* nums, int iS, int iE)
{
int iMid = ;
int iMax = ;
int iSum = ;
int i = ; iMid = (iS + iE) / ;
iSum = iMax = nums[iMid] + nums[iMid + ]; /* for pre */
for (i = iMid - ; i >= ; i--)
{
iSum += nums[i];
if (iSum > iMax) iMax = iSum;
} /* for after */
for (i = iMid + ; i <= iE; i++)
{
iSum += nums[i];
if (iSum > iMax) iMax = iSum;
} return iMax;
} int GetMaxSubRe(int* nums, int iS, int iE)
{
int iMaxLeft = ;
int iMaxRight = ;
int iMaxMid = ;
int iMid = ; if (iS == iE)
{
return ((nums[iS] > ) ? nums[iS] : );
} iMid = (iS + iE) / ; /* mid pos */ iMaxLeft = GetMaxSubRe (nums, iS, iMid);
iMaxRight = GetMaxSubRe (nums, iMid + , iE);
iMaxMid = GetMidMax(nums, iS, iE); return MAX_INT(MAX_INT(iMaxRight, iMaxLeft), iMaxMid); } int maxSubArray(int* nums, int numsSize) {
int iRet = ;
iRet = GetMaxSubRe(nums, , numsSize - ); return iRet;
}
总结:
看了运行结果统计,效率没什么提升,和个人理解的不一样,应该是test case的原因。分治的时间效率应该比穷举法好,o(nlogn) < o(n^2)
alg--分治法的更多相关文章
- 分治法求解最近对问题(c++)
#include"stdafx.h" #include<iostream> #include<cmath> #define TRUE 1 #define F ...
- 分治法避免定义多个递归函数,应该使用ResultType
总结:对二叉树应用分治法时,应避免定义多个递归函数,当出现需要递归求解多种的结果时,尽量使用ResultType来让一次递归返回多种结果. 题目:Binary Tree Maximum Path Su ...
- ACM/ICPC 之 分治法入门(画图模拟:POJ 2083)
题意:大致就是要求画出这个有规律的Fractal图形了= = 例如 1 对应 X 2 对应 X X X X X 这个题是个理解分治法很典型的例子(详情请参见Code) 分治法:不断缩小规 ...
- 分治法(一)(zt)
这篇文章将讨论: 1) 分治策略的思想和理论 2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性. 说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它 ...
- 分治法求一个N个元素数组的逆序数
背景 逆序数:也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时, ...
- 《github一天一道算法题》:分治法求数组最大连续子序列和
看书.思考.写代码. /*************************************** * copyright@hustyangju * blog: http://blog.csdn. ...
- 用分治法解决最近点对问题:python实现
最近点对问题:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.需要说明的是理论上最近点对并不止一对,但是无论是寻找全部还是仅寻找其中之一,其原理没有区别,仅需略作改造即可 ...
- C语言实现快速排序法(分治法)
title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true --- 算法原理 分治法的基本思 ...
- p1257 平面上最接近点对---(分治法)
首先就是一维最接近点的情况... #include<iostream> #include<cstdio> #include<cstring> #include< ...
- (分治法 快速幂)51nod1046 A^B Mod C
1046 A^B Mod C 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. 收起 输入 3个正整数A B C,中间用空格分隔.(1 < ...
随机推荐
- iOS应用主流UI架构实现
一.介绍 如今iOS开发过程中,最常见的一种UI架构是:界面底部是四五个tab bar .中间是内容显示.顶部是包括标题及返回等操作button,当点击进入某个模块后可以点击进行返回.这样的架构的应用 ...
- 安装多个版本号jdk后java -version不改变的问题解决
1.问题 比方先安装了jdk7后,再安装jdk6,java -version就是显示java1.6,即使把JAVA_HOME和path改动为java7的路径,java -version依旧还是显示6. ...
- windows下mysql5.6.20使用mysqldumpslow.pl分析慢日志
要想执行mysqldumpslow.pl(这是perl程序),下载perl编译器. 下载地址:http://pan.baidu.com/s/1i3GLKAp 就是ActivePerl_5.16.2.3 ...
- 纯JS监听document是否加载完成
欢迎加入前端交流群交流知识&&获取视频资料:749539640 概述 一个document 的 Document.readyState 属性描述了文档的加载状态. 一个文档的 read ...
- js重定向
在现行的网站应用中URL重定向的应用有很多: 404页面处理.网址改变(t.sina转到weibo.com).多个网站地址(如:http://www.google.com/ .www.g.cn )等: ...
- Java登录界面简单设计
package cn.com.view; import java.awt.Color; import java.awt.Font; import java.awt.SystemColor; impor ...
- iOS怎么判断字典中存在nil值
遍历字典中的key,然后根据key值取出对应的value如:for (NSString *key in dict) { //处理字典的键值 NSString *value = dict[key]; i ...
- python之路——二分查找算法
楔子 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72 ...
- .net 获取当前网页的的url
正确的方法是:HttpContext.Current.Request.Url.PathAndQuery1.通过ASP.NET获取 如果测试的url地址是http://www.test.com/test ...
- zookeeper单机和奇数集群
zookeeper单机和奇数集群 链接地址:https://www.cnblogs.com/lsdb/p/7297731.html