数据结构学习笔记(中国大学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)=max{0,∑k=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;
}
时间对比
//
n
l
o
g
n
<
n
2
?
nlogn<n^2?
nlogn<n2?