《算法导论》——MaximumSubArray
今天我们讨论的算法是最大子数组问题。
首先我定义了一个类用来保存最大子数组的开始位置索引、结束位置索引和该数组的和。代码如下:
class MaximumSubArray
{
private:
int begin; //开始位置索引
int end; //结束位置索引
int sum; //和
public:
void setBegin(int Begin)
{
begin=Begin;
}
void setEnd(int End)
{
end=End;
}
void setSum(int Sum)
{
sum=Sum;
} int getBegin()
{
return begin;
}
int getEnd()
{
return end;
}
int getSum()
{
return sum;
}
};
该算法采用分治策略,我们先讨论最大子数组跨越中点位置的情况:
MaximumSubArray FindMaxCrossingSubArray(int *numArray,int low,int middle,int high)
{
MaximumSubArray max;
int leftsum=numArray[middle];
int maxleft=middle;
int sum=;
for(int i=middle;i>=low;i--)
{
sum+=numArray[i];
if(sum>=leftsum)
{
leftsum=sum;
maxleft=i;
}
}
int rightsum=numArray[middle+];
int maxright=middle+;
sum=;
for(int j=middle+;j<=high;j++)
{
sum+=numArray[j];
if(sum>=rightsum)
{
rightsum=sum;
maxright=j;
}
}
max.setBegin(maxleft);
max.setEnd(maxright);
max.setSum(leftsum+rightsum);
return max;
}
接下来是二分法求最大子数组:
MaximumSubArray FindMaximumSubArray(int *numArray,const int low,const int high)
{
MaximumSubArray max;
if(high==low)
{
max.setBegin(low);
max.setEnd(high);
max.setSum(numArray[low]);
return max;
}
if(high-==low)
{
max.setBegin(high);
max.setEnd(high);
max.setSum(numArray[high]);
return max;
}
int middle=(low+high)/;
MaximumSubArray left=FindMaximumSubArray(numArray,low,middle);
MaximumSubArray right=FindMaximumSubArray(numArray,middle,high);
MaximumSubArray cross=FindMaxCrossingSubArray(numArray,low,middle,high);
if(left.getSum()>=right.getSum()&&left.getSum()>=cross.getSum())
max=left;
else if(right.getSum()>left.getSum()&&right.getSum()>=cross.getSum())
max=right;
else
max=cross;
return max;
}
注意:
该书中的伪代码并没有以下这段
if(high-==low)
{
max.setBegin(high);
max.setEnd(high);
max.setSum(numArray[high]);
return max;
}
因为在算法递归到数组中只有两个元素的时候,算出的middle值和low值是一样的(& 索引为0和1的两个元素),所以,在high==low的时候去索引小的元素,在high-1=low的时候取索引大的元素,避免无限循环。
以上代码,请放到如下注释的位置,保存为SubArray.h
#include <stdlib.h> namespace dksl
{
//
//
//
}
下面是程序测试代码及运行结果:
#include "stdafx.h"
#include <iostream>
#include "SubArray.h" using namespace std;
using namespace dksl;
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {, -, -, , -, -, -, , , -, , -, -, , -, };
MaximumSubArray max=FindMaximumSubArray(a,,);
cout<<"begin:"<<max.getBegin()<<endl;
cout<<"end:"<<max.getEnd()<<endl;
cout<<"sum:"<<max.getSum()<<endl;
system("PAUSE");
return ;
}

该算法的时间复杂度为θ(nlogn)
《算法导论》——MaximumSubArray的更多相关文章
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
- 基本数据结构(2)——算法导论(12)
1. 引言 这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍 我们在上一篇中提过,栈与队 ...
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- quickSort算法导论版实现
本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...
- [算法导论]二叉查找树的实现 @ Python
<算法导论>第三版的BST(二叉查找树)的实现: class Tree: def __init__(self): self.root = None # Definition for a b ...
- 算法导论第十八章 B树
一.高级数据结构 本章以后到第21章(并查集)隶属于高级数据结构的内容.前面还留了两章:贪心算法和摊还分析,打算后面再来补充.之前的章节讨论的支持动态数据集上的操作,如查找.插入.删除等都是基于简单的 ...
- 算法导论----VLSI芯片测试; n个手机中过半是好的,找出哪些是好手机
对于分治(Divide and Conquer)的题目,最重要是 1.如何将原问题分解为若干个子问题, 2.子问题中是所有的都需要求解,还是选择一部分子问题即可. 还有一点其实非常关键,但是往往会被忽 ...
- [置顶] 《算法导论》习题解答搬运&&学习笔记 索引目录
开始学习<算法导论>了,虽然是本大部头,可能很难一下子看完,我还是会慢慢地研究的. 课后的习题和思考有些是很有挑战性的题目,我等蒻菜很难独立解决. 然后发现了Google上有挺全的algo ...
- (搬运)《算法导论》习题解答 Chapter 22.1-1(入度和出度)
(搬运)<算法导论>习题解答 Chapter 22.1-1(入度和出度) 思路:遍历邻接列表即可; 伪代码: for u 属于 Vertex for v属于 Adj[u] outdegre ...
随机推荐
- DS二叉树--层次遍历
题目描述 层次遍历二叉树,是从根结点开始遍历,按层次次序“自上而下,从左至右”访问树中的各结点. 建树方法采用“先序遍历+空树用0表示”的方法 要求:采用队列对象实现,函数框架如下: 输入 第一行输入 ...
- PREV-2_蓝桥杯_打印十字图
问题描述 小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示: ..$$$$$$$$$$$$$....$...........$..$$$.$$$$$$$$$.$$$$...$...... ...
- 【springboot】之常用技术文档
https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/index.html
- C++11--20分钟了解C++11 (上)
20分钟了解C++ 11 1 初始化列表 Initializer List //C++ 03中用初始化列表初始化数组 int arr[4] = {3, 2, 4, 5}; vector<int& ...
- servlet.xml 出现 Referenced file contains errors(http://.......)
问题描述: 打开Eclipse突然发现Web工程的servlet.xml突然报了红叉叉,错误信息如下: Referenced file contains errors (http://www.spri ...
- [ZZ]39条更好的软件开发方法
1.重构是程序员的主力技能. 2.工作日志能提升脑容量. 3.先用profiler调查,才有脸谈优化. 4.注释贵精不贵多.杜绝大姨妈般的“例注”.漫山遍野的碎碎念注释,实际就是背景噪音. 5.普通程 ...
- 在linux下sh批处理文件调用java的方法
解密 java -classpath collection-impl-0.0.1.jar com.ai.toptea.collection.message.DESEncrypt 1EFE4663895 ...
- keras LSTM学习实例
1. 购物时间预测 http://www.cnblogs.com/arkenstone/p/5794063.html https://github.com/CasiaFan/time_seires_p ...
- 禅道在docker上部署与迁移
一.禅道部署 1.下载地址 禅道开源版: http://dl.cnezsoft.com/zentao/docker/docker_zentao.zip 数据库用户名: root,默认密码: 123 ...
- EXT.NET 一些用法
EXT.NET 一些用法 <ext:GridPanel ClicksToEdit="1" <%-- 点击几下单元格可编辑 1 代表单击一下.--%> > & ...