ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-30 20:32:36  阅读:148  来源: 互联网

标签:MOOC int double sum 陈越 ++ MAXN max 数据结构


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有