什么是数据结构?
-
数据结构是是数据对象在计算机中的组织方式。
- 分为逻辑结构。
- 物理存储结构
-
解决问题方法的效率,跟***数据的组织方式***有关、跟***空间的利用效率***有关、跟***算法的巧妙程度***有关。
-
抽象数据类型:
只描述数据对象集和相关操作集"是什么",并不涉及"如何做到"的问题。
什么是算法?
- 有穷性(Finiteness)。算法的有穷性是指算法必须能在执行有限个步骤之后终止;
- 确切性(Definiteness)。算法的每一步骤必须有确切的定义;
- 输入项(Input)。一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
- 输出项(Output)。一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
- 可行性(Effectiveness)。算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。
什么是好的算法?
- 空间复杂度S(n):占用存储单元的长度。
- 时间复杂读T(n):耗费时间的长度。
- 一个for循环的时间复杂读等于循环次数乘以循环体代码的复杂度。
- if-else结构的复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取决于三者中最大。
求最大子列和?
给定N个整数的序列{
A
1
,
A
2
,
.
.
.
,
A
N
{A_1,A_2,...,A_N}
A1,A2,...,AN},求函数
f
(
i
,
j
)
=
m
a
x
{
0
,
∑
k
=
i
j
A
k
f(i,j)=max\{0,\sum_{k=i}^j A_k
f(i,j)=max{0,∑k=ijAk }$的最大值。
算法1:
int MaxSubseqSum1(int A[], int N)
{
int ThisSum,maxSum=0;
int i,j,k;
for(i=o;i<N;i++){/*i是子列左端的位置*/
ThisSum=0; /*ThisSum是A[i]到A[j]的子列和*/
for(j=i;j<N;j++){/*j是子列右端的位置*/
ThisSum += A[k];
if(ThisSu>MaxSum)
maxSum=ThisSum; /*则更新结果*/
} /* j循环结束 */
}/* i循环结束 */
return MaxSum;
} //T(N) = O(N^3)
算法2:对于相同的i,不同的j,只要在j-1次循环的基础上累加1项即可
//T(N) = O(N^2)
算法3:分而治之
//T(N) = O(NlogN)
算法4:在线处理
int MaxSubseSum4(int A[], int N)
{
int ThisSum,MaxSum;
int i;
ThisSum = MaxSum =0;
for(i =0 ;i<N;i++){
ThisSum += A[i]; //向右累加
if(ThisSum > MaxSum)
MaxSum = ThisSum;
else if(ThisSum<0)
ThisSum = 0;
}
return MaxSum;
} //T(N) = O(N)