算法导论4.1

4.1-1

返回由最大负数组成的单元素子数组

4.1-2

代码如下:

#include<iostream>
using namespace std;
int main() {
	int a[16] = { 13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7 };
	int n = 16;
	int max_sum = 0, max_left = 0, max_right = 0;
	for (int i = 0; i < n; i++) {
		int sum = 0;
		for (int j = i; j < n; j++) {
			sum += a[j];
			if (sum > max_sum) {
				max_sum = sum;
				max_left = i;
				max_right = j;
			}
		}
	}
	printf("sum: %d  [%d,%d]", max_sum, max_left, max_right);
	return 0;
}

4.1-3

一个的复杂度是 O ( n 2 ) O(n^2) O(n2),一个是 O ( n l g ( n ) ) O(nlg(n)) O(nlg(n)),思路是先计算出交叉点,再设计大致规模的测试数据,具体的懒得实操了。

修改后算法就是暴力法和递归法的结合,由于 n 0 n_0 n0的存在,在 [ 0 , n 0 ] [0,n_0] [0,n0]之间是暴力法,在 [ n 0 , + ∞ ] [n_0,+∞] [n0,+]是递归法

  1. n 0 n_0 n0小于等于原交叉点 x 0 x_0 x0时,交叉点不改变,因为在原交叉点 [ n 0 , x 0 ] [n_0,x_0] [n0,x0]仍是递归法,且此时递归处理的效率不如暴力处理,从 x 0 x_0 x0之后递归的效率才超出暴力法

  2. n 0 n_0 n0大于原交叉点 x 0 x_0 x0时,交叉点增大到 n 0 n_0 n0,此时改良后的算法在 [ 0 , x 0 ] [0,x_0] [0,x0]时效率等于暴力法,在 [ x 0 , n 0 ] [x_0,n_0] [x0,n0]之间,虽然递归处理效率更高,但是由于仍使用暴力法,所以并没有性能交叉,而在 [ n 0 , + ∞ ] [n_0,+∞] [n0,+]之后,采用了递归法,且由于 x 0 < n 0 x_0<n_0 x0<n0,此时递归效率高于暴力法,所以性能交叉点变为 n 0 n_0 n0

4.1-4

在high=low时,即递归终结点处,设置,若此时a[high]<0,则返回(-1,-1,0)。

4.1-5

如图,写的有点乱,a、max、b既代表子数组又代表子数组之和。

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值