《数据结构》MOOC陈越 第一章
作者:互联网
1 基本概念
1.1 什么是数据结构
【思考】如何在书架上摆放图书?
找到空的书架,按照类别对图书进行分类,在每一种小类中按书名首字母按序排列。
【结果】被摆了一道
【例2】循环和递归的区别:递归对空间的耗用很大。
解决方法的效率和空间利用效率有关。
【例3】写程序计算给定多项式在给定点x处的值。f(x)=a0+a1x+……+an-1xn-1+anxn(代码见文末)
什么是数据结构?
数据对象的逻辑结构+物理存储结构
+算法
描述数据结构很好的方法:抽象 数据类型
数据类型:数据对象集、数据集合相关联的操作集
抽象:描述数据类型的方法不依赖于具体实现
与存放数据的机器无关
与数据存储的物理结构无关
与实现操作的算法和编程语言无关
只描述数据对象集和操作集是什么,不探讨如何实现。
1.2 什么是算法
一、算法(Algorithm):
- 一个有限的指令集;
- 接受一些输入(有些情况不需要输入);
- 产生输出;
- 一定在有限步骤之后终止;
- 每一条指令必须:有充分明确的目标,计算机能处理的范围之内,描述应不依赖于任何一门计算机语言或具体实现手段。
二、评判算法好坏的标准:
- 空间复杂度 S(n):占用存储单元的长度。
- 时间复杂度 T(n):耗费时间的长度。
1.3 应用实例:最大子列和
算法一:暴力求解
int main()
{
int i,j,k;
int MAXN;
scanf("%d",&MAXN);
int a[MAXN];
int n;
int sum;
int max = 0;
for( n = 0; n < MAXN; n++)
{
scanf("%d",&a[n]);
}
//首i循环
for( i = 0; i < MAXN; i++ )
{
//j
for( j = i+1; j < MAXN; j++ )
{
sum = 0;
//k
for( k = i; k <= j; k++ )
{
sum += a[k];
}
//compare sum,max
if( sum > max )
{
max = sum;
}
}
}
printf("%d",max);
return 0;
}
时间复杂度:O(n3)
算法二:改进算法
#include<stdio.h>
int main()
{
int i,j;
int MAXN;
scanf("%d",&MAXN);
int a[MAXN];
int n;
int sum;
int max = 0;
for( n = 0; n < MAXN; n++)
{
scanf("%d",&a[n]);
}
//首i循环
for( i = 0; i < MAXN; i++ )
{
sum = a[i]; //和算法一不同
//j
for( j = i+1; j < MAXN; j++ )
{
sum += a[j];
//compare sum,max
if( sum > max )
{
max = sum;
}
}
}
printf("%d",max);
return 0;
}
算法三:分而治之
#include<stdio.h>
int COMPARE (int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
int MAXNUM2 ( int a[], int N, int M )
{
int MID = (M+N)/2;
int maxLeft,maxRight,maxMid;
maxLeft = maxRight = maxMid = 0;
int maxMid1,maxMid2;
maxMid1 = maxMid2 = 0;
int sum;
int i,j;
int MAXNUM1;
if ( N == M)
{
return COMPARE(a[N],0);
}
else
{
maxLeft = COMPARE( MAXNUM2 ( a, N, MID ), maxLeft );
maxRight = COMPARE( MAXNUM2 ( a, MID+1, M ), maxRight );
for ( i = MID,sum = 0; i >= N; i--)
{
sum += a[i];
maxMid1 = COMPARE( sum, maxMid1 );
}
for ( j = MID+1,sum = 0; j <= M; j++)
{
sum += a[j];
maxMid2 = COMPARE( sum, maxMid2 );
}
maxMid = maxMid1 + maxMid2;
MAXNUM1 = COMPARE( COMPARE( maxLeft, maxRight ), maxMid );
}
return MAXNUM1;
}
int main()
{
int MAXN;
scanf("%d",&MAXN);
int a[MAXN];
int n;
for( n = 0; n < MAXN; n++)
{
scanf("%d",&a[n]);
}
printf("%d",MAXNUM2 ( a, 0, MAXN-1));
return 0;
}
算法四:动态算法
#include<stdio.h>
int main()
{
int MAXN;
scanf("%d",&MAXN);
int sum;
int a[MAXN];
int i,n;
int max = 0;
for( n = 0; n < MAXN; n++)
{
scanf("%d",&a[n]);
}
for ( i = 0; i < MAXN; i++)
{
sum += a[i];
if ( sum < 0)
{
sum = 0;
continue;
}
if ( sum > max)
{
max = sum;
}
}
printf("%d",max);
return 0;
}
【例3 代码】
#include<stdio.h>
#include<time.h>
#include<math.h>
#define MAXN 10
#define MAXK 1e7
clock_t start,stop;
double duraction;
double duoxs1 ( double x , double a[] , int n);
double duoxs2 ( double x , double a[] , int n);
int main()
{
int i;
double a[MAXN];
for( i = 0; i < MAXN; i++)
{
a[i] = (double)i;
}
start = clock();
for(int j = 0; j < MAXK ; j++)
{
duoxs1 ( 1.1 , a, 8);
}
stop = clock();
duraction =( (double)(stop-start)) / CLK_TCK / MAXK;
printf("%f\n",(double)(stop-start));
printf("%f\n",duraction);
start = clock();
for(int j = 0; j < MAXK ; j++)
{
duoxs2 ( 1.1 , a, 8);
}
stop = clock();
duraction =( (double)(stop-start)) / CLK_TCK / MAXK;
printf("%f\n",(double)(stop-start));
printf("%f\n",duraction);
return 0;
}
double duoxs1 ( double x , double a[] , int n)
{
double p = a[n];
for( int i = n ; i > 0 ; i-- )
{
p = p * x + a[i-1];
}
return p
;
}
double duoxs2 ( double x , double a[] , int n)
{
double p = a[0];
for(int i = 1;i < n+1; i++)
{
p += pow(x,i);
}
return p;
}
标签:MOOC,int,double,sum,陈越,++,MAXN,max,数据结构 来源: https://blog.csdn.net/SuPer_Ivan/article/details/118355640