浙江大学数据结构第一讲:1.1什么是数据结构

第一讲:基本概念

1.1:什么是数据结构?
1.1.1: 图书摆放问题:
讨论:对中等规模、大规模的图书摆放,你有什么更好的建议 ?
一、把图书分类:把书分为科技类、艺术类、杂志等等种类;
二、每一类对应着一个字符或者汉字索引;
三、利用计算机建立索引目录,对所有的书按类别,按时间出版时间、按按类别等方式进行编号;
四、动态扩容:当一个类型的书达到计算机容量限度要可以扩容,达到增加书籍数量的目的;

1.1.2:关于空间使用 —例:PrintN函数实现:
写一个程序实现一个函数PrintN,使得传入的一个正整数为N的参数后,能顺序打印从1到N的全部整数

#include<stdio.h> 
int N;
void printN1(int N){     //for循环实现 
	int i;
	for(i = 1;i <= N; i++){
		printf("%d、", i );
	}
	printf("\n");
}

void printN2(int N){    //递归实现 
	if(N){
		printN2(N - 1);
		printf("%d、", N );
	}
} 
int main(void){
	scanf("%d" , &N);
	printN1( N );
	printN2( N );
}

1.1.3:关于算法效率 —例:计算多项式的值
写程序计算给定多项式 f(X)=a0+a1x+a2x^2 +…+anx^n 在给定点x处的值

#include 
#include 
#include 
clock_t start, stop;
double duration;
#define MAXN 10   //多项式最大项数,即多项式阶数+1 
#define MAXK 1e7  //函数重复调用的最大次数 
double f1( int n, double a[], double x ){
	int i;
	double p = a[0];
	for(i = 1; i <= n; i++ )
		p += (a[i] * pow(x,i));
	return p;
} 

double f2( int n , double a[] , double x ){
	int i;
	double p = a[n];
	for( i=n ; i>0 ; i-- )
		p = a[i-1] + x* p;
	return p;
} 
int main(void){
	int i;
	double a[MAXN];  //储存多项式的系数
	for( i = 0 ; i < MAXN ; i++ )
		a[i] = ( double ) i;

	start = clock();
	for( i=0 ; i<MAXK ; i++ )	
		f1(MAXN - 1, a , 1.1 );
	stop = clock();
	duration = ( (double) (stop - start) ) / CLK_TCK / MAXK;
	printf("ticks1 = %f \n",(double)(stop - start));
	printf("duration1 = %6.2e\n",duration);
	
	start = clock();
	for( i=0 ; i<MAXK ; i++ )
		f2(MAXN - 1, a , 1.1 );
	stop = clock();
	duration = ( (double) (stop - start) ) / CLK_TCK / MAXK;
	printf("ticks2 = %f \n",(double)(stop - start));
	printf("duration2 = %6.2e\n",duration);
	
	return 0;
}

写程序计算给定多项式 f(X)=1+x+x^2 /2+…+x^i/ i+…+x^100/100 在给定点x处的值

#include 
#include 
#include 
clock_t start, stop;
double duration;
int n = 100;
#define MAXK 2000  //函数重复调用的最大次数 
double f1( double x , double a[]){
	int i;
	double p = a[0] = 1.0;
	for(i = 1; i <= n; i++ ){
	
		p += pow( x , i ) * a[i] ;
	}
	return p;
} 

double f2( double x , double a[]){
	int i;
	double p = a[n];
	for( i=n-1 ; i>=0 ; i-- ){
		p = a[i]+ x * p ;
	}
	return p;
} 
int main(void){
	int i;
	double a[ n + 1 ];
	a[0] = 1.0;
	for(i=1 ; i<= n ; i++ )
		a[i] = 1 / (double)i;
	start = clock();
	for( i=0 ; i<MAXK ; i++ )	
		f1( 1.1 , a );
	stop = clock();
	printf("普通算法实现:\n");
	printf("f(x) = %f\n",f1( 1.1 , a ));
	duration = ( (double) (stop - start) ) / CLK_TCK / MAXK;
	printf("程序运行2000次所用时间:ticks1 = %f \n",(double)(stop - start));
	printf("平均时间:duration1 = %6.2e\n",duration);
	
	start = clock();
	for( i=0 ; i<MAXK ; i++ )
		f2( 1.1 , a );
	stop = clock();
	printf("\n秦九韶算法实现:\n");
	printf("f(x) = %f\n",f2( 1.1 , a ));
	duration = ( (double) (stop - start) ) / CLK_TCK / MAXK;
	printf("程序运行2000次所用时间:ticks2 = %f \n",(double)(stop - start));
	printf("平均时间:duration2 = %6.2e\n",duration);
	
	return 0;
}

你可能感兴趣的:(Java练习)