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 < ...
随机推荐
- 项目 cmdb(一)
Django之ModelForm组件 ModelForm a. class Meta: model, # 对应Mode ...
- 网络编程----堵塞、非堵塞和同步、异步IO
我是学渣.但我想进步. 本文是面试我的牛人问我的.你知道什么是堵塞.非堵塞和同步.异步IO么?自觉得是分布式系统程序猿的我居然不知道.学习吧. 首先介绍堵塞IO和非堵塞IO: 堵塞IO:是指说程序等待 ...
- 站点搭建从零開始(七) WordPress站点的完好
1.WordPress站点前后端经常使用语言简单介绍和执行过程 通常一个站点的整个构建过程中须要大量的技术支持,尤其是用到非常多种计算机语言.站点的构建主要分后端和前端两部分,后端代码在server上 ...
- UML的基本图(二)
Both sequence diagrams and communication diagrams are kinds of interaction diagrams. An interacti ...
- VMware workstation虚拟机不能联网解决方法
以备后用. 第一步:先设置VMware的编辑——虚拟网络编辑器,启用VMnet8,NAT模式,如下图所示. 其实就是VMware默认的设置,无须更改,如果不小心改了,点击还原默认设置. 第二步:虚拟机 ...
- 输入URL 一瞬间发生了什么
当你在浏览器中输入url后发生了什么?下面是个人学习过程中的总结,如有理解不正确或不足的地方希望大家指出.先上一张脑图: 还有个问题:www.baidu.com 键入后,域名怎么知道的是这个IP! 补 ...
- yolo源码解析(3):视频检测流程
代码在自己电脑中!!!!不在服务器 根据前文所说yolo代码逻辑: ├── examples │ ├── darknet.c(主程序) │ │── xxx1.c │ └── xxx2.c │ ├── ...
- python spark 随机森林入门demo
class pyspark.mllib.tree.RandomForest[source] Learning algorithm for a random forest model for class ...
- strlen和mb_strlen
在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别.下面通过例子,讲解这两者之间的区别. 先看例子: <?php // ...
- yii依赖注入
为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Service Locator) ...