数据结构笔记(一)

一.递归和循环的区别

void loop()
{
	
	for(int i=0;i<N;i++)
		printf("%d\n",i);
}

 

 

void recursion(int n)
{
	if(n){
		recursion(n-1);
		printf("%d\n",n);
	}

}

 

 

void Test1()
{
	
	start=clock();
	loop();
	end=clock();
	printf("ticke1=%f\n",(double)(end-start));
	printf("time = %f\n",(double)((end-start)/CLK_TCK));
	

	start=clock();
	recursion(N);
	end=clock();
	printf("ticke1=%f\n",(double)(end-start));
	printf("time = %f\n",(double)(end-start)/CLK_TCK);
	printf("clk-tck=%f\n",CLK_TCK);

}

 


数据结构笔记(一)_第1张图片
 

看起来差不多,但是递归存在压栈的过程,会存在栈溢出问题

二.多项式计算

double f1(int a[],int n,double x)
{
	double result=0;
	for(int i=0;i<n;i++)
		result=result+a[i]*pow(x,i);
	return result;
}

 

 

double f2(int a[],int n,double x)
{
	double result=0;
	for(int i=n;i>0;i--)
		result=a[i-1]+x*result;
	return result;
}

 


数据结构笔记(一)_第2张图片
 

 

 

 

第二个算法较优,第一个算法复杂度太高。聪明地利用算法,提高效率

三.最大字段和

     给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和 

 

算法一: O(n3)

//暴力法 三重循环
int count1()
{
	int maxCount=0;
	int temp=0;
	for(int i=0;i<len;i++)
		
		for(int j=i;j<len;j++){
		
			
			for(int k=i;k<=j;k++){	

				temp+=s[k];
				if(temp>maxCount)
				{
					maxCount=temp;
					head=i;
					tail=k;
				}

			}
			temp=0;
		}
		return maxCount;
}

 

算法二:O(n2)

//暴力法,二重循环
int count2()
{
	int maxCount=0;
	int temp=0;
	for(int i=0;i<len;i++){
		for(int j=i;j>0;j--){
			temp+=s[j];
			if(temp>maxCount)
			{
				maxCount=temp;
				head=j;
				tail=i;
			}
		
		}
		temp=0;
	}



	return maxCount;
}

 

算法三:O(n*logn)

//分治法,nlogn复杂度
int count3(int left,int right)
{
	if(left==right)
		if(s[left]>0)
			return s[left];
		else 
			return 0;
	int mid =(left+right)/2;
	int maxLeft=count3(left,mid);
	int maxRight=count3(mid+1,right);
	int templ=0,tempr=0;
	int maxl=0,maxr=0;
	
	for(int i=mid;i>=left;i--)
	{
		templ+=s[i];
		if(templ>maxl){
			maxl=templ;

		}
	}
	for(int i=mid+1;i<=right;i++)
	{
		tempr+=s[i];
		if(tempr>maxr){
			maxr=tempr;
	
		}
	}
	int border=maxl+maxr;
	if(maxl>maxr)
		if(maxl>border){

		
			return maxl;
		}
		else{
			
			return border;
		}
	else
		if(maxr>border){
			
			return maxr;
		}
		else{
		
			return border;
		}
}

 

算法四:O(n)

//在线处理
int count4(int num)
{
	int ThisSum=0,MaxSum=0;
	for(int i=0;i<num;i++)
	{
		ThisSum+=s[i];
		if(ThisSum>MaxSum)
			MaxSum=ThisSum;
		else if(ThisSum<0)
			ThisSum=0;
	}
	return MaxSum;
	
}

 

你可能感兴趣的:(数据结构)