数据之间的逻辑关系:存储实现(如何存储某种逻辑关系)

关系对应的操作:运算实现(在这种存储模式下,如何实现相关操作)
存储实现
运算实现
时间性能
空间性能
算法优化问题提出
O(N3)O(N^3)O(N3)的算法
O(N2)O(N^2)O(N2)的算法
O(NlogN)O(NlogN)O(NlogN)的算法
O(N)的算法
需要储存的
信息
物理结构
如何存储
元素及其关系
算法优化指的是优化算法的时间性能和空间性能。需要慢慢分析,逐步优化。
以最大连续子序列和问题为例来看算法优化问题。
给定整数序列,寻找最大的子序列和,例如,对于序列{-2, 11, -4, 13, -5, 2},答案是20。
这是最直观的算法。用起点和终点来确认一个子序列,这样我们就可以用两层的嵌套循环,枚举出所有的子序列:
int maxSubsequenceSum(int a[], int size, int &start, int &end) {int maxSum = 0;// 枚举起点 ifor (int i = 0; i < size; i++ ) {// 枚举终点 jfor( int j = i; j < size; j++ ) {int thisSum = 0; // 计算i到j的子序列和for( int k = i; k <= j; k++ ) thisSum += a[ k ];// 如果是最大的,存下这个子序列的起点和终点以及最大的和if( thisSum > maxSum ) {maxSum = thisSum;start = i; end = j;}}}return maxSum;
}
在枚举的时候,i到 j+1 这个子序列的和,没必要再用一个for循环,可以直接在 i到 j 这个子序列的和上再加1个数,省略到最里层的循环。
int maxSubsequenceSum(int a[], int size, int &start, int &end) {int maxSum = 0;for (int i = 0; i < size; i++ ) {int thisSum = 0; for( int j = i; j < size; j++ ) {// 直接在之前的计算结果上加上一个数,就能得到i到j的子序列和thisSum += a[ j ];if( thisSum > maxSum ) {maxSum = thisSum;start = i; end = j}}}return maxSum;
}
分成不同的情况来解决:
int maxSum(int a[ ], int left, int right , int &start, int &end) {int maxLeft, maxRight, center;int leftSum = 0, rightSum = 0; int maxLeftTmp = 0, maxRightTmp = 0; int startL , startR, endL, endR; // 递归的终止条件if (left == right) { start = end = left;return a[left] > 0 ? a[left] : 0;}center = (left + right) / 2; // 递归地计算整个位于前半部的最大连续子序列maxLeft = maxSum(a, left, center, startL, endL); // 递归地计算整个位于后半部的最大连续子序列maxRight = maxSum(a, center + 1, right, startR, endR); // 计算从前半部开始在后半部结束的最大连续子序列的和// 选择三个值中的最大值if (maxLeft > maxRight ) if (maxLeft > maxLeftTmp + maxRightTmp) {start = startL;end = endL;return maxLeft;}else return maxLeftTmp + maxRightTmp;elseif (maxRight > maxLeftTmp + maxRightTmp) {start = startR;end = endR;return maxRight;}else return maxLeftTmp + maxRightTmp;
}
int maxSubsequenceSum(int a[], int size, int &start, int &end) { // starttmp用于保存前面的最优方案int maxSum, starttmp, thisSum; start = end = maxSum = starttmp = thisSum = 0; for( int j = 0; j < size ; ++j ) {thisSum += a[j];if ( thisSum <= 0 ) { thisSum = 0; starttmp = j+1;} else if (thisSum > maxSum ) { maxSum = thisSum; start = starttmp;end = j; }} return maxSum;
}