本章研究的问题及其四种算法:
//立方算法
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]。