《数据结构与算法分析 C语言描述》读书笔记——分治算法

书中用求解最大子序列和的方式介绍了分治算法(divide-and-conquer) 
分治算法是一种相对快速的算法 运行时间为O(logN)

最大子序列和的问题如下: 
给出一组整数 A1  A2 … AN 
求∑jk=i Ak 
若所有整数均为负 则最大子序列和为0 
e.g. 输入-2, 11,-4, 13, -5, -2 输出20(A2到A4)

分治算法就如同字面描述的一样 先分再治 
分 指的是将问题分为两部分几乎相同的子问题 进行递归求解 
治 指的是将 分 的解通过简单的手段合并 得到最终解

对于上述例子 可以把数列分成两个部分: 
-2, 11, -4(后文称为Left部分) 和 13, -5, -2(后文称为Right部分) 
这样最大子序列的和的出现就有3种情况(在程序中需要分别求的)

  • 全部出现在Left部分中
  • 全部出现在Right部分中
  • 一部分在Left部分中 另一部分在Right部分中

对于第三种特殊情况 可以求包含Left部分最后一个元素和Right部分第一个元素的子序列和 这样Left部分和Right部分就链接到了一起

接下来解决递归问题

  1. 为了处理递归输入 函数需要接收左右边界的位置 那么第一次调用函数时传入的左右边界就是0和N-1了
  2. 最重要的是基本情况:当左右边界相同时 返回这个重叠位置的元素(当然前提是大于零的时候)

    大体就是这样 
    上代码

#include <stdio.h>

int imax (int a, int b, int c)
{
    return (a>b?a:b)>c?(a>b?a:b):c;
}

static int MaxSubSum(const int A[], int Left, int Right)
{
    if (Left == Right)
    {
        if (A[Left] > 0)
            return A[Left];
        else
            return 0;
    }

    int Center = (Left + Right) / 2;
    int MaxLeftSum = MaxSubSum(A, Left, Center);              //1
    int MaxRightSum = MaxSubSum(A, Center+1, Right);          //2

    int MaxLeftBorderSum = 0, LeftBorderSum = 0;              //3
    for (int i = Center; i >= Left; i--)
    {
        LeftBorderSum += A[i];
        if (LeftBorderSum > MaxLeftBorderSum)
            MaxLeftBorderSum = LeftBorderSum;
    }

    int MaxRightBorderSum = 0, RightBorderSum = 0;
    for (int i = Center+1; i <= Right; i++)
    {
        RightBorderSum += A[i];
        if (RightBorderSum > MaxRightBorderSum)
            MaxRightBorderSum = RightBorderSum;
    }                                                         //4

    return imax(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum);
}

int MaxSubSequenceSum(const int A[], int N)
{
    return MaxSubSum(A, 0, N - 1);
}

int main()
{
    int A[] = {-2, 11, -4, 13, -5, -2};
    printf("%d\n", MaxSubSequenceSum(A, sizeof(A)/sizeof(A[0])));

    return 0;
}

1是求全部出现在Left部分中的情况 
2是求全部出现在Right部分中的情况 
3~4就是求第三种情况 
最后再比较一下找到最大值

书上说 
程序短并不意味着程序好

这个程序的优点就是 快

我的CSDN: http://blog.csdn.net/oblivion1221

时间: 2024-10-17 13:30:32

《数据结构与算法分析 C语言描述》读书笔记——分治算法的相关文章

《数据结构与算法分析—C语言描述》pdf

下载地址:网盘下载 内容简介 编辑 <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于<数据结构与算法分析:C语言描述(原书第2版)>选材新颖,方法实用,题例丰富,取舍得当.<数据结构与算法分析:C语言描述(原书第2版)>的目的是培养学生良好的程序设计技巧和熟练的算

数据结构与算法分析 c语言描述 pdf 高清下载

网盘下载:数据结构与算法分析 c语言描述 pdf 高清下载 – 易分享电子书PDF资源网 作者: [美] Mark Allen Weiss 出版社: 机械工业出版社 副标题: C语言描述 原作名: Data Structures and Algorithm Analysis in C:Second Edition 译者: 冯舜玺 出版年: 2004-1-1 页数: 391 定价: 35.00元 装帧: 平装 内容简介 · · · · · · 本书是<Data Structures and Alg

数据结构与算法分析_Java语言描述(第2版)pdf

下载地址:网盘下载 本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计). 随着计算机速度的不断增加和功能的日益强大,人们对有效编程和算法分析的要求也不断增长.本书将算法分析与最有效率的Java程序的开发有机地结合起来,深入分析每种算法,并细致讲解精心构造程序的方法,内容全面.缜密严格. 第3版的主要更新如下: ? 第4章包含AVL树删除算法的实现. ? 第5章进行了全面修订和扩充,现在包含两种较

《数据结构与算法分析Java语言描述》PDF文件免费下载

图书简介: 本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计). 随着计算机速度的不断增加和功能的日益强大,人们对有效编程和算法分析的要求也不断增长.本书把算法分析与最有效率的Java程序的开发有机地结合起来,深入分析每种算法,内容全面.缜密严格,并细致讲解精心构造程序的方法. 图书目录部分截图: 结语:总结 数据结构与算法分析需要这份PDF文档的朋友,欢迎加Q群:219571750,免费领取,

《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了生命. 本章学习重点: 理解抽象数据类型(ADT)的概念 学习如何对表进行有效的操作 熟悉栈ADT及其在实现递归方面的应用 熟悉队列ADT及其在操作系统和算法设计中的应用 ADT 抽象数据类型(abstract data type)是一个操作的集合,是数学的抽象,在ADT中不涉及如何实现操作的集合,这可以看作是模块化设计的扩充. 对于每

【数据结构与算法分析——C语言描述】练习1.1——选择问题

本部分内容来自http://www.cnblogs.com/mingc,笔者在此只用于整理学习. 问题描述:编写一个程序解决选择问题.令k=N/2.画出表格显示你的程序对于N为不同值时的运行时间. 理解:设有一组N个数确定其中第k个最大者,称选择问题(selection problem) 思路:读入前k个数到临时数组tmp(并按降序排列).然后逐个读取后续数字X,当X大于第k个数时,将其加入数组tmp(并按降序排列).最后返回位置k-1上的值 #include <stdio.h> #inclu

数据结构与算法分析_Java语言描述(第2版)高清版pdf免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介编辑“数据结构”是计算机专业的基础与核心课程之一,Java是现今一种热门的语言.本书在编写过程中特别考虑到了面向对象程序设计(OOP)的思想与Java语言的特性.它不是从基于另一种程序设计语言的数据结构教材简单地“改编”而来的,因此在数据结构的实现上更加“地道”地运用了Java语言,并且自始至终强调以面向对象的方式来思考.分析和解决问题.本书是为数据结构入门课程(通常课号是CS-2)而编写的教材.作者Frank Carrano在编写过程自始至终特别

《数据结构与算法分析——C语言描述》ADT实现(NO.01) : 栈(Stack)

这次的数据结构是一种特殊的线性表:栈(Stack) 栈的特点是后入先出(LIFO),可见的只有栈顶的一个元素. 栈在程序中的地位非常重要,其中最重要的应用就是函数的调用.每次函数调用时都会创建该函数的一个“活动记录”( Activation Record ,或称作“帧”( Frame ))压入运行时堆栈中,用于保存函数的参数,返回值,返回指令地址,返回活动记录地址,局部变量等内容.当然,在高级语言中我们不需要手动完成这一工作,学习汇编语言时会体会到其真正过程. 下面给出笔者对于堆栈的两种实现.首

《数据结构与算法分析——c语言描述》读后笔记 5

将中缀表达式转换成后缀表达式并输出,然后计算出后缀表达式的值. 程序: #include<stdio.h> #include<string.h> #include<stdlib.h> #include"stack.h" char* infix_to_postfix(char* str) {     int i,j=0;     int SIZE=strlen(str);     if(str==NULL)     { printf("emp