数据结构
数据结构是ADT(抽象数据类型Abstract Data Type)的物理实现。
解决问题方法的效率与:
循环解决PrintN
void PrintN(int N)
{
int i;
for (i = 1 ;i<N ;i++)
printf("%d\n", i);
return ;
}
递归解决
void PrintN(int N)
{
if(N){
printN(N-1);
printf("%d\n",N);
}
return ;
}
这里递归的原理是当 N >=1 时候会不断的调用PrintN(N-1),比如在一个stack上一直堆积...
直到调用到PrintN(1),此时会执行最PrintN(0)PrintN(0)不满足if(N)的条件,会直接return,然后每一个调用的stack上的逐个return回来,形成从1打印到N....
过程应该如图
PrintN(N) print N
|
PrintN(N-1) print N -1
|
.......
|
PrintN(0) return
而如果N太大就会把stack内存用完,递归算法就无法执行
注意因为Stack是一层传递到上一层到上一层,所以打印顺序就是1,2,....N
算多项式的值
定义式算法
f(x) = a0 + a1x +...+an-1xn-1 + anxn
double f(int n, double a[], double x)
{
int i;
double p[0] = a[0];
for (int i = 1; i <= n; i++)
p += ( a[i] * pow(x,i))
return p;
}
巧妙一点的算法
f(x) = a0 + x(a1 +x(...+(an-1 + x(an))...))
double f(int n, double a[], double x)
{
int i;
double p = a[n];
for (int i = n; i > 0; i--)
p = a[i-1] + x*p;
return p;
}
抽象数据类型
关心数据对象集和相关操作“是什么”,不那么关心如何实现
例子
类型名称: 矩阵(Matrix)
对象集:AM,N = (aij)(i = 1,....M;j=1,....N)
操作集:
Matrix Create(int M, int N)
int GetMaxRow(Matrix A)
int GetMaxCol(Matrix B)
ElementType GetEntry(Matrix, int i, int j)
Matrix Add(Matrix A, Matrix B)
Matrix Multiply(Matrix A, Matrix B)
....
实际上我觉得如果有学过一门面向对象的语言会更容易理解,类也是抽象出来的,是被我们封装好了,然后留有接口给外部用
抽象数据类型的抽象就有一点面向对象的感觉,同一种数据类型,比如Stack,我们可以在python中写,也可以在C中写(C的对象性没有那么强),但我们调用pop函数,返回的都是stack顶上的那个element,而Elementtype正是告诉了我们这个Stack中可以装int,float,甚至struct,搞懂了一种数据类型,之后此种的implement,使用就会呈现一劳永逸的状态
在学的过程中,我觉得首先要抽象化,比如queue,比如stack,比如linked list先明白针对这种数据类型一些特有的操作和带来的结果
抽象化之后再来代码化,美化,优化,同时把这种数据类型的代码好好自己留下来,因为自己写的总顺手嘛,而且以后用的机会可多了.....
算法
算法顾名思义:计算方法
void SelectionSort( int List[], int N )
{
/*将N个整数List[0]...List[N-1]进行非递减排序 */
for (i = 0 ; i < N; i++){
MinPosition = ScanForMin(List, i, N-1);
/*从List[i]到List[N–1]中找最小元,并将其位置赋给MinPosition */
Swap(List[i], List[MinPosition]);
/*将未排序部分的最小元换到有序部分的最后位置 */
}
}
算法复杂度
空间复杂度 S(n)
时间复杂度 T(n)
最大子列和问题
给定N个整数的序列{A1,A2,...AN} , 求函数 f(i,j) = max(0,∑jk = i的最大值Ak)的最大值
算法一:
int MaxSubseqSum1( int A[], int N)
{ int ThisSum, MaxSum = 0;
int i, j, k;
for( i = 0; i < N; i++){
for( j = i; j < N; j++){
ThisSum = 0;
for( k = i ; k<= j ; k++)
ThisSum += A[k];
if(ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
容易理解
但是 T(N) = O(N3)
算法二:
int MaxSubseqSum2( int A[], int N)
{ int ThisSum, MaxSum = 0;
int i, j;
for( i = 0; i < N; i++){
ThisSum = 0;
for(j = i; j < N; j++){
ThisSum += A[j];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
T(N) = O(N2)
算法三
分而治之
....
算法四
int MaxSubseqSum4( int A[], int N)
{ int ThisSum, MaxSum = 0;
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 )
原文:http://www.cnblogs.com/yuxue/p/4189273.html