算法与设计第二次作业

计科2101董佳怡 2022-09-26 23:20:41
1.伪代码
int maxSum_2(int a[], int low, int high, int &L, int &R)
{
int mid;
int sum = 0;      //记录最大字段
int leftsum = 0;  //记录左边最大字段
int rightsum = 0; //记录右边最大字段
int rs = 0;       //记录中间部分右边字段的最大字段

int ls = 0;       //记录中间部分左边字段的最大字段
int lefts = 0;    //记录从中间到最左边的数据之和
int rights = 0;   //记录从中间到最右边的数据之和
int i;
int j;
if (low == high)
{
if (a[low] > 0)
sum = a[low];
else
sum = 0;
}
if (low < high)
{
mid = (low + high) / 2;
leftsum = maxSum_2(a, low, mid, L, R);       //寻找左边最大字段
rightsum = maxSum_2(a, mid + 1, high, L, R); //寻找右边最大字段
for (i = mid; i >= low; i--)
{
lefts += a[i];
if (ls < lefts)
{
ls = lefts;
L = i;
}
}
for (j = mid + 1; j <= high; j++)
{
rights += a[j];
if (rs < rights)
{
rs = rights;
R = j;
}
}
sum = ls + rs; //sum保存前后两段的最大字段之和
}
if (sum < rightsum)
{
sum = rightsum; //将右边字段设为最大字段
L = mid;
R = high;
}
if (sum < leftsum)
{
sum = leftsum; //将左边字段为最大字段
L = low;
R = mid;
}
return sum;
}

2.时间复杂度

当n=1时,T(n)=O(1)——不需要排序比大小找数

当n>1时,T(n) = 4T(n/2)+O(n)= n的以2为底4的对数次方=O(n^2)

3.体会与思考

分治法即把一个大问题分解成几个子问题,然后逐个分解这些子问题,最后把解决的子问题合成父问题的解。很多涉及数据多、计算量大的问题,若直接按顺序挨个检索效率会很低;如果将此问题分解为小问题,然后进行递归调用,效率就高得多。它本质是一种提高机器办事效率的思路。

 

...全文
8 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
gdufscs

124

社区成员

广东外语外贸大学信息科学与技术学院
算法 高校
社区管理员
  • brisksea
加入社区
帖子事件
创建了帖子
2022-09-26 23:20
社区公告
暂无公告