博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大子数组问题
阅读量:7124 次
发布时间:2019-06-28

本文共 3744 字,大约阅读时间需要 12 分钟。

1. 问题描述

对于数组(如下),求解其最大子数组.

   

结果为:

2. 算法设计

采用递归的方法求解

A. 求解数组左半部分的最大子数组

B. 求解数组右半部分的最大子数组

C. 求解整个数组的最大子数组

D. 比较A,B,C求出的结果,选出一个最大值,即为最终结果.

3. 数据结构设计

A. 中间结果的三元组,(子数组下标,子数组上标,子数组和)

1    class Tuple2     {3     public:4         int low, high, sum;5         Tuple(int l = 0, int h = 0, int s = 0):low(l), high(h), sum(s) { }6     };

 

B. 数组元素

1  std::vector
m_array;

 

4. 算法实现

算法实现文件: calc_max_subarray.h

1 #include 
2 #include
3 #include
4 #include
5 6 using namespace std; 7 8 namespace nsp_subarray 9 { 10 class Tuple 11 { 12 public: 13 int low, high, sum; 14 Tuple(int l = 0, int h = 0, int s = 0):low(l), high(h), sum(s) { } 15 }; 16 17 class SubArray 18 { 19 private: 20 std::vector
m_array; 21 public: 22 SubArray() { m_array.clear(); } 23 24 virtual ~SubArray(){} 25 26 void init_data(string fileName) 27 { 28 ifstream in(fileName.c_str()); 29 while(!in.eof()) 30 { 31 int e = 0; 32 in >> e; 33 m_array.push_back(e); 34 } 35 } 36 37 inline int get_array_size() { return m_array.size(); } 38 39 Tuple find_max_crossing_subarray(int low, int mid, int high) 40 { 41 int m_leftSum = INT_MIN; 42 int m_rightSum = INT_MIN; 43 44 int m_maxLeft = mid; 45 int m_maxRight = mid + 1; 46 47 int sum = 0; 48 49 for (int i = mid; i >= low; i--) 50 { 51 sum += m_array[i]; 52 if (sum > m_leftSum) 53 { 54 m_leftSum = sum; 55 m_maxLeft = i; 56 } 57 } 58 59 sum = 0; 60 for (int i = mid + 1; i <= high; i++) 61 { 62 sum += m_array[i]; 63 if (sum > m_rightSum) 64 { 65 m_rightSum = sum; 66 m_maxRight = i; 67 } 68 } 69 70 return Tuple(m_maxLeft, m_maxRight, m_leftSum + m_rightSum); 71 } 72 73 Tuple find_maximum_subarray(int low, int high) 74 { 75 if (low == high) 76 { 77 return Tuple(low, high, m_array[low]); 78 } 79 else if (low < high) 80 { 81 int mid = (low + high) / 2.0; 82 Tuple tLeft = find_maximum_subarray(low, mid); 83 84 Tuple tRight = find_maximum_subarray(mid + 1, high); 85 86 Tuple tCross = find_max_crossing_subarray(low, mid, high); 87 88 if (tLeft.sum >= tRight.sum && tLeft.sum >= tCross.sum) 89 { 90 return tLeft; 91 } 92 else if (tRight.sum >= tLeft.sum && tRight.sum >= tCross.sum) 93 { 94 return tRight; 95 } 96 else 97 { 98 return tCross; 99 }100 }101 }102 };103 };

 

main.cpp

1 #include
2 #include "calc_max_subarray.h" 3 4 using namespace std; 5 using namespace nsp_subarray; 6 7 int main() 8 { 9 SubArray a;10 Tuple t;11 12 a.init_data("A.txt");13 14 t = a.find_maximum_subarray(0, a.get_array_size() - 1);15 16 return 0;17 }

 

6. 文件内容

文件为: A.txt,内容如下.

13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7

链接: 密码:0id2

 

转载于:https://www.cnblogs.com/BigBigLiang/p/4999251.html

你可能感兴趣的文章
linux系统目录结构详解(简单易懂)
查看>>
学习《Effective C++》
查看>>
CS224n笔记9 机器翻译和高级LSTM及GRU
查看>>
KVM虚拟机
查看>>
GdiPlus[57]: 图像(九) IGPBitmap 特有的属性与方法
查看>>
Windows 多媒体函数(winmm.dll 中的函数)汇总
查看>>
关于 Delphi 中流的使用(4) 遍历读取流中的所有数据
查看>>
使用 IntraWeb (4) - 页面布局之 TIWRegion
查看>>
域控的升级及客户端加入域
查看>>
【Java每日一题】20161129
查看>>
[译文]greenlet:轻量级并发程序
查看>>
五分钟学会HTML
查看>>
请求Servlet 得到 Request 里所有对象
查看>>
volatile 和 synchronized 的比较
查看>>
Java递归
查看>>
windows 操作系统原版下载地址
查看>>
剑指offer——O(1)时间删除单链表节点
查看>>
OSPF在企业网络中的应用
查看>>
什么是NIO(转载)
查看>>
第五课 SCCM2012通过OSD功能实现操作系统部署(上)
查看>>