一.递归和循环的区别
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); }
看起来差不多,但是递归存在压栈的过程,会存在栈溢出问题
二.多项式计算
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; }
第二个算法较优,第一个算法复杂度太高。聪明地利用算法,提高效率
三.最大字段和
给定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; }