数据结构学习

数据结构学习笔记(中国大学mooc)

浙大数据结构

第一章:基本概念

例1:print N

//循环
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的值相当大时(如100000),递归方法停止运行,循环法仍可运行。
归因:递归法虽好理解,但空间复杂度太大。

例2:多项式求解

1//1.暴力求解
#include<iostream>
#include<math.h> 
using namespace std;
double f(int n,double a[],int x){
	int i;
	double p=a[0];
	for(i=1;i<=n;i++)
	p+=(a[i]*pow(x,i));
	return p;
}
 
int main()
{
double a[10]={2,4,6,8,9,2,3,4,5,6};
printf("%f",f(9,a,7));
 return 0;
}
//2.秦九韶
double f(int n,double a[],int x){
	int i;
	double p=a[n];
	for(i=n;i>0;i--)
    p=p*x+a[i-1];
	return p;
}
//3.运行时间对比
//clock功能的使用
#include<iostream>
#include<math.h>
#include<time.h> 
using namespace std;
double f1(int n,double a[],int 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[],int x){
	int i;
	double p=a[n];
	for(i=n;i>0;i--)
    p=p*x+a[i-1];
	return p;
}
#define max 1e7
int main()
{
	int i;
clock_t start,stop;
double duration;
double a[10]={2,4,6,8,9,2,3,4,5,6};
start=clock();
for(i=1;i<=max;i++)
f1(9,a,7);
stop=clock();
duration=((double)(stop-start))/max;
printf("ticket1=%f\n",(double)(stop-start));
printf("duration1=%6.5e\n",duration);


start=clock(); 
for(i=1;i<=max;i++)
f2(9,a,7);
stop=clock();
duration=((double)(stop-start))/max;
printf("ticket2=%f\n",(double)(stop-start));
printf("duration2=%6.5e",duration);
 return 0;
}

例3:最大子列和的问题

描述:给定N个整数组成的序列 { A 1 , A 2 , . . . . . , A n A_1,A_2,.....,A_n A1,A2,.....,An},求函数 f ( i , j ) = m a x { 0 , ∑ k = i j A k } f(i,j)=max{0, \sum_{k=i}^j A_k} f(i,j)=max0k=ijAk的最大值。
算法1:

int MaxSubsequenceSum1(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;
} 

复杂度为O( n 3 n^3 n3);
算法2:

int MaxSubsequenceSum2(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;
} 

算法复杂度为 O ( n 2 ) O(n^2) O(n2);
算法3:分治算法
在这里插入图片描述

//分治算法
int Max3(int x,int y,int z){
	int max;
	max=(x>y)?x:y;
	max=(max>z)?max:z;
	return max;
}
 
  int MaxSubSum( int a[],int Left,int Right){
	int MaxLeftSum,MaxRightSum;
	int MaxLeftBorderSum,MaxRightBorderSum;
	int LeftBorderSum,RightBorderSum;
	int Center,i;
	if(Left==Right)
	return a[Left];
	Center=(Left+Right)/2;
	MaxLeftSum=MaxSubSum(a,Left,Center);
	MaxRightSum=MaxSubSum(a,Center+1,Right);
	 MaxLeftBorderSum=LeftBorderSum=0;
	for(i=Center;i>=0;i--){
		LeftBorderSum+=a[i];
		if(LeftBorderSum>MaxLeftBorderSum)
		MaxLeftBorderSum=LeftBorderSum;
	}
	MaxRightBorderSum=RightBorderSum=0;
	for(i=Center+1;i<=Right;i++){
		RightBorderSum+=a[i];
		if(RightBorderSum>MaxRightBorderSum)
		MaxRightBorderSum=RightBorderSum;
	}
	return Max3(MaxLeftSum,MaxRightSum,MaxRightBorderSum+MaxLeftBorderSum);		
}
int MaxSubsequenceSum3(int a[],int N){
	return MaxSubSum(a,0,N-1);
}

算法复杂度 O ( n l o g n ) O(nlogn) O(nlogn);
算法4:在线处理

//算法4 在线处理 
 int MaxSubsequenceSum4(int a[],int N){
int ThisSum,MaxSum;
ThisSum=MaxSum=0;
int i;
for(i=0;i<N;i++){
	ThisSum+=a[i];
	if(ThisSum>MaxSum)
	 MaxSum=ThisSum;
	 else if(ThisSum<0)
	 ThisSum=0;
}
return MaxSum;
}

总运行代码及时间对比

#include<iostream>
#include<math.h>
#include<time.h> 
using namespace std;
int sum(int m,int n){
   int sum;
   int i;
    for(i=m;i<=n;i++){
        sum+=m;
        m+=1;
    }
    printf("%d",sum);
    return 0;
}
//算法1 
int MaxSubsequenceSum1(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;
} 
//算法2 
int MaxSubsequenceSum2(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;
} 
//算法3 分治 
int Max3(int x,int y,int z){
	int max;
	max=(x>y)?x:y;
	max=(max>z)?max:z;
	return max;
}
 
  int MaxSubSum( int a[],int Left,int Right){
	int MaxLeftSum,MaxRightSum;
	int MaxLeftBorderSum,MaxRightBorderSum;
	int LeftBorderSum,RightBorderSum;
	int Center,i;
	if(Left==Right)
	return a[Left];
	Center=(Left+Right)/2;
	MaxLeftSum=MaxSubSum(a,Left,Center);
	MaxRightSum=MaxSubSum(a,Center+1,Right);
	 MaxLeftBorderSum=LeftBorderSum=0;
	for(i=Center;i>=0;i--){
		LeftBorderSum+=a[i];
		if(LeftBorderSum>MaxLeftBorderSum)
		MaxLeftBorderSum=LeftBorderSum;
	}
	MaxRightBorderSum=RightBorderSum=0;
	for(i=Center+1;i<=Right;i++){
		RightBorderSum+=a[i];
		if(RightBorderSum>MaxRightBorderSum)
		MaxRightBorderSum=RightBorderSum;
	}
	return Max3(MaxLeftSum,MaxRightSum,MaxRightBorderSum+MaxLeftBorderSum);		
}
int MaxSubsequenceSum3(int a[],int N){
	return MaxSubSum(a,0,N-1);
}

//算法4 在线处理 
 int MaxSubsequenceSum4(int a[],int N){
int ThisSum,MaxSum;
ThisSum=MaxSum=0;
int i;
for(i=0;i<N;i++){
	ThisSum+=a[i];
	if(ThisSum>MaxSum)
	 MaxSum=ThisSum;
	 else if(ThisSum<0)
	 ThisSum=0;
}
return MaxSum;
}
#define max 1e7
int main()
{
double duration;	
int a[10]={12,-15,34,-26,13,18,26,-9,-17};
int N=10;
int i;
clock_t start,stop;
start=clock();
for(i=1;i<=max;i++)
MaxSubsequenceSum1(a,N);
stop=clock();
duration=((double)(stop-start))/max;
printf("ticket1=%f\n",(double)(stop-start));
printf("duration1=%6.5e\n",duration);
start=clock();
for(i=1;i<=max;i++)
MaxSubsequenceSum2(a,N);
stop=clock();
duration=((double)(stop-start))/max;
printf("ticket2=%f\n",(double)(stop-start));
printf("duration2=%6.5e\n",duration);
start=clock();
for(i=1;i<=max;i++)
MaxSubsequenceSum3(a,N);
stop=clock();
duration=((double)(stop-start))/max;
printf("ticket3=%f\n",(double)(stop-start));
printf("duration3=%6.5e\n",duration);
start=clock();
for(i=1;i<=max;i++)
MaxSubsequenceSum4(a,N);
stop=clock();
duration=((double)(stop-start))/max;
printf("ticket4=%f\n",(double)(stop-start));
printf("duration4=%6.5e\n",duration);
return 0;
} 

时间对比
nlogn<n^2?
// n l o g n < n 2 ? nlogn<n^2? nlogn<n2?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值