其他分享
首页 > 其他分享> > 《数据结构》MOOC陈越 第一章

《数据结构》MOOC陈越 第一章

作者:互联网

1 基本概念

1.1 什么是数据结构

【思考】如何在书架上摆放图书?
找到空的书架,按照类别对图书进行分类,在每一种小类中按书名首字母按序排列。
【结果】被摆了一道

【例2】循环和递归的区别:递归对空间的耗用很大。
解决方法的效率和空间利用效率有关。

【例3】写程序计算给定多项式在给定点x处的值。f(x)=a0+a1x+……+an-1xn-1+anxn(代码见文末)

什么是数据结构?
数据对象的逻辑结构+物理存储结构
+算法

描述数据结构很好的方法:抽象 数据类型
数据类型:数据对象集、数据集合相关联的操作集
抽象:描述数据类型的方法不依赖于具体实现
与存放数据的机器无关
与数据存储的物理结构无关
与实现操作的算法和编程语言无关
只描述数据对象集和操作集是什么,不探讨如何实现。

1.2 什么是算法

一、算法(Algorithm):

  1. 一个有限的指令集;
  2. 接受一些输入(有些情况不需要输入);
  3. 产生输出;
  4. 一定在有限步骤之后终止;
  5. 每一条指令必须:有充分明确的目标,计算机能处理的范围之内,描述应不依赖于任何一门计算机语言或具体实现手段。

二、评判算法好坏的标准:

  1. 空间复杂度 S(n):占用存储单元的长度。
  2. 时间复杂度 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