一、抽象数据类型 (Abstract Data Type)
1. 数据类型
- 数据对象集
- 数据集合相关联的操作集
2.抽象:描述数据类型的方法不依赖于具体实现
- 与存放数据的机器无关
- 与数据存储的物理结构无关
- 与实现操作的算法和编程语言均无关
二、算法(Algorithm)
- 一个有限的指令集
- 接受一些输入(有些情况下不需要输入)
- 产生输出
- 一定在有限步骤后终止
- 每一条指令必须
有充分明确的目标,不可以有歧义 计算机能处理的范围之内 描述应不依赖于任何一种计算机语言以及具体的实现手段
三、算法的复杂度
- 空间复杂度S(n): 根据算法写成的程序在执行时占用储存单元的长度。
- 时间复杂度T(n): 根据算法写成的程序在执行时消耗时间的长度。(另: 若一个算法的时间复杂度为n2,应想办法将其降为nlog(n))
四、应用实例:最大子列和问题
算法1: T(n) = O(n3)
int maxSubseqSum1(int arr[], int n)
{
int maxSum{}, thisSum;
for (int i{}; i< n; i++) {
for (int j{i}; j< n; j++) {
thisSum = 0;
for (int k{i}; k <=j; k++) {
thisSum += arr[k];
}
if (thisSum> maxSum) {
maxSum = thisSum;
}
}
}
return maxSum;
}
算法2: T(n) = O(n2)
int maxSubseqSum2(int arr[], int n)
{
int maxSum{}, thisSum;
for (int i{}; i< n; i++) {
thisSum = 0;
for (int j{i}; j< n; j++) {
thisSum += arr[j];
if (thisSum> maxSum) {
maxSum = thisSum;
}
}
}
return maxSum;
}
算法3(分而治之): T(n) = O(nlog(n)) 将数组从中间分开处理,分别计算左右两半边的最大子列和,同时计算跨越中间区域的最大子列和,返回这三者中的最大值。 其时间复杂度等于处理左右半边的时间复杂度加上处理跨区元素的时间复杂度(三部分之和),即(假设处理一个元素的时间复杂度T(1) = O(1)): T(n) = T(n / 2) + T(n / 2) + O(n) = 2 * T(n / 2) + c * n 注: 这里(c * n)为n的常数倍,即处理n个O(1)所需的时间 = 2 * [2 * T(n / 22) + c * (n / 2)] + c * n = 22T(n / 22) + 2 * c * n 以此类推,假设经过k步调用后需处理的元素只剩下一个,有: T(n) = 2kT(n / 2k) + k * c * n 其中: n / 2k = 1 = n * O(1) + c * n * log(n) = O(n) + O(nlog(n)) 当两个不同的复杂度加在一起时,取较大的那一项,所以: T(n) = O(nlog(n))
int maxSubseqSum3(int arr[], int fir, int last)
{
if (fir == last) {
return arr[fir];
}
int leftMax, rightMax, maxSum{};
leftMax = maxSubseqSum3(arr, fir, (fir + last) / 2);
rightMax = maxSubseqSum3(arr, (fir + last) / 2 + 1, last);
for (int i{(fir + last) / 2}, thisSum{arr[i]}; i >=fir; i--, thisSum += arr[i]) {
if (thisSum> maxSum) {
maxSum = thisSum;
}
}
for (int i{(fir + last) / 2 + 1}, thisSum{arr[i]}, tmpMaxSum{maxSum}; i <=last; i++, thisSum += arr[i]) {
if (thisSum> maxSum - tmpMaxSum) {
maxSum = tmpMaxSum + thisSum;
}
}
if (leftMax> maxSum) {
maxSum = leftMax;
}
if (rightMax> maxSum) {
maxSum = rightMax;
}
return maxSum;
}
算法4(在线处理): T(n) = O(n)
int maxSubseqSum4(int arr[], int n)
{
int maxSum{}, thisSum{};
for (int i{}; i< n; i++) {
thisSum += arr[i];
if (thisSum> maxSum) {
maxSum = thisSum;
}
if (thisSum< 0) {
thisSum = 0;
}
}
return maxSum;
}
|