第八章 算法设计技术

    本章研究的问题及其四种算法:

//立方算法
int cube_algorithm(int arry[], int n)
{
	int maxsofar = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = i; j < n; j++)
		{
			int sum = 0;
			for (int k = i; k <= j; k++)
			{
				sum += arry[k];
			}
			maxsofar = max(maxsofar, sum);
		}
	}
	return maxsofar;
}

//平方算法1
int square_algorithm1(int arry[], int n)
{
	int maxsofar = 0;
	for (int i = 0; i < n; i++)
	{
		int sum = 0;
		for (int j = i; j < n; j++)
		{
			sum += arry[j];
			maxsofar = max(maxsofar, sum);
		}
	}
	return maxsofar;
}

//平方算法2
int square_algorithm2(int arry[], int n)
{
	int *cumarr;
	int * realarry = new int[n + 1];
	realarry[0] = 0;
	cumarr = realarry + 1;

	for (int i = 0; i < n; i++)
	{
		cumarr[i] = cumarr[i - 1] + arry[i];
	}

	int maxsofar = 0;
	
	for (int i = 0; i < n; i++)
	{
		int sum = 0;
		for (int j = i; j < n; j++)
		{
			sum = cumarr[j] - cumarr[i - 1];
			maxsofar = max(maxsofar, sum);
		}
	}
	return maxsofar;
}

//次平方算法
int subquadratic_alogrithm(int arry[], int l, int r)
{
	if (l > r)
	{
		return 0;
	}
	if (l == r)
	{
		return max(0, arry[l]);
	}
	int m = (l + r) / 2;
	int lmax, rmax, sum;
	lmax = sum = 0;
	for (int i = m; i >= l; i--)     //跨边界最大子向量在a中部分是a中包含右边界的最大子向量
	{
		sum += arry[i];
		lmax = max(lmax, sum);
	}

	rmax = sum = 0;
	for (int j = m + 1; j <= r; j++) //跨边界最大子向量在b中部分是b中包含左边界的最大子向量
	{
		sum += arry[j];
		rmax = max(rmax, sum);
	}
	return max(lmax + rmax, max(subquadratic_alogrithm(arry, l, m), subquadratic_alogrithm(arry, m + 1, r)));//返回3个总和中的最大者
}

//线性算法
int linear_algorithm(int arry[], int n)
{
	int maxsofar = 0;
	int maxendinghere = 0;
	for (int i = 0; i < n; i++)
	{
		maxendinghere = max(maxendinghere + arry[i], 0);
		maxsofar = max(maxsofar, maxendinghere);
	}
	return maxsofar;
}

习题10. 假设我们想要查找的是总和最接近0的子向量,而不是具有最大和的子向量,设计一种算法实现。

int func1(int * pArry, int len)
{
	int * cum = 0;
	int * realarry = new int[len + 1];
	realarry[0] = 0;  
	cum = realarry + 1;  //cum[-1] = 0

	//累计pArry[0....i]的和存放于cum[i]中
	for (int i = 0; i < len; i++)
	{
		cum[i] = cum[i - 1] + pArry[i];
	}
	sort(cum, cum + len); //对cum排序
	int iMin = cum[1] - cum[0];
	for (int k = 1; k < len; k++)
	{
		iMin = min(iMin, cum[k] - cum[k - 1]);  //返回相邻两个元素差值最小的
	}
	return iMin;
}

习题11. 收费公路由n个收费站之间的n-1段公路组成,每一段公路都有相关的使用费。描述一个数据结构,该结构仅需要O(n)的空间却可以在固定的时间内完成任意路段的费用计算。

      思路:将前i(1~n-1)段公路的费用和累计于数组cum[i - 1]中,则任意路段i~j的费用则为cum[j -1] - cum[(i -1) - 1]。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值