数据结构与算法分析——分治法

#include<stdio.h>
int bigger(int a,int b)
{
    return (a>b?a:b);
}
int max(int a,int b,int c)
{
    return bigger(a,bigger(b,c));
}
int maxsubsequencesum(const int A[],int left,int right)
{
    int maxleftsum,maxrightsum;
    int maxleftbordersum,maxrightbordersum;
    int leftbordersum,rightbordersum;
    int centre;

    if(left==right)
    {
        if(A[left]>0) return A[left];
        else return 0;
    }
    centre = (left+right)/2;
    maxleftsum=maxsubsequencesum(A,left,centre);
    maxrightsum=maxsubsequencesum(A,centre+1,right);

    maxleftbordersum=0;leftbordersum=0;
    for (int i = centre; i >= left; --i)
    {
        leftbordersum+=A[i];
        if(leftbordersum>maxleftbordersum) maxleftbordersum=leftbordersum;
    }

    maxrightbordersum=0;rightbordersum=0;
    for (int i = centre+1; i<=right;++i)
    {
        rightbordersum+=A[i];
        if(rightbordersum>maxrightbordersum) maxrightbordersum=rightbordersum;
    }

    return max(maxleftsum,maxrightsum,maxrightbordersum+maxleftbordersum);
}
int main()
{
    int n;
    scanf("%d",&n);
    int A[100];
    for (int i = 0; i < n; ++i)
    {
        scanf("%d",&A[i]);
    }
    printf("%d\n",maxsubsequencesum(A,0,n-1));
}

看了一下午,终于把算法时间复杂度看完!

然后学着来敲这个O(NlogN)的分治法找最大连续和,这堆代码主要是找4,-3,5,-2,-1,2,6,-2的最大连续和(当然也适用于其他数列)。

主要感想和问题:

首先遇到了scope的问题,没搞清楚const和extern,intern,auto,register,static的区别!

然后是日常的敲错了代码运动不起来,模仿了两次都不行,然后最后一下自己推倒重来!果然看书上代码不能照搬,一定要彻底理解了再动手自己亲自敲。

时间: 2024-10-09 22:33:41

数据结构与算法分析——分治法的相关文章

算法分析与设计——分治法实验报告

   算法导论  课程设计 成 绩 题    目:  算法导论课程设计实验报告 学院班级:        1613013         学    号:      16130130216       姓    名:        库 妍           主讲教师:        张立勇          日    期:       2019.6.3         录 分治法 一.Implement exercise 2.3-7................................

数据结构之分治法(最短距离)-(十一)

package com.lip.datastructure; /** * @author lip * 分治法,所谓分治当然是分而治之,化整为零. * 分治法分为两部分,1.分(Divide)2.治(Conquer) * 在排序算法中我们用到的二分排序就是分治法最经典的一个例子 * 传统的分治法要运行两次及其以上的递归算法,一般用分治法解决问题的时间复杂度是O(N*lgN) */ public class DivideAndConquer { /*求平面上两个点的最短距离 * 方法一:就是两个fo

数据结构与算法6 - 分治法(上)

分治法: 1. 将问题拆分为几个子问题,并且这些子问题和原问题相似只是量级上小一些. 2. 递归地解决每一个子问题,然后结合这些子问题的解决方案构造出原问题的解决方案. 我们已经遇到过的问题: 1. 二分搜索 2. 归并排序 3. 快速排序 分治法例子: 练习1:快速指数: 能够快速计算出a的n次方 def Fast_pow(a, n): if n == 0: return 1.0 elif n < 0: return 1 / Fast_pow(a, -n) elif n % 2: # 奇数 r

分治法(一)

这篇文章将讨论: 1) 分治策略的思想和理论 2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性. 说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它们放在一起来比较,看看分治是如何实现滴.由于内容太多,我将再花一篇文章来写4个之前没有写过的分治算法:1,大整数乘法   2,矩阵乘法的分治策略   3,最近点对  4,凸包问题,请见下一篇. 好了,切入正题. --------------------------------------------

算法(二)--------分治法

分治法的适?条件: • 该问题的规模缩?到?定程度就可以容易地解决.• 该问题可以分解为若?个规模较?的相同问题:递归思想的应?• 该问题所分解出的各个?问题是相互独?的,即?问题之间不包含公共的?问题.• 利?该问题分解出的?问题的解可以合并为该问题的解. 案例---快排: (1)过程 • Divide (Partition) – 对元素进?重排以得到这样?个划分 • 在某个位置s前?的所有元素都?于等于A[s] • 在位置s后?的所有元素都?于等于A[s]• Conquer: ?个划分确定后

分治法(二)

参考  <算法设计与分析> 第四章 分治法     Anany Levitin著  翻译版   清华大学出版社 在上一篇文章中,介绍了分治策略的思想,主定理,以及几个用分治策略的经典案例.这一篇文章将继续探讨分治算法的其他应用,包括大整数乘法和Strassen矩阵乘法,最近点对问题和凸包问题这4个算法,一般来说常规的数据结构教程上不包括这些内容. --------------------------------------------------------------------------

《数据结构与算法分析》学习笔记(二)——算法分析

一.对算法分析方法的最简单的理解和使用方法 1.首先大家可能一般会被那些数学的概念搞晕,其实简单理解下来,就是假设任何语句执行的效率都是一样的,所以设定每一个语句的执行时间都是一个时间单位,那么只要计算这个程序到底执行了多少语句,就可以算出其时间复杂度. 2.其次就是我们要明白,我们是个估算,所以可以进行化简,明显我们可以忽略那些相对来说低阶的项,只分洗最高阶项.然后主要就是有这些常见的法则: (1)FOR循环 一次for循环的运行时间至多是该for循环内语句的运行时间乘以迭代次数. (2)嵌套

分治法、动态规划、回溯法、分支界限法、贪心算法

转:http://blog.csdn.net/lcj_cjfykx/article/details/41691787 分治算法一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时

算法中的递归分析和分治法的原理

分析递归算法三种方法 替换法.迭代法.通用法(master method) 作用:分析递归算法的运行时间 分治算法 将一个问题分解为与原问题相似但规模更小的若干子问题,递归地解这些子问题,然后将这些子问题的解结合起来构成原问题的解.这种方法在每层递归上均包括三个步骤: divide(分解):将问题划分为若干个子问题 conquer(求解):递归地解这些子问题:若子问题Size足够小,则直接解决之 Combine(组合):将子问题的解组合成原问题的解 其中的第二步很关键:递归调用或直接求解  (递