算法的学习——分治算法

实现算法导论的第一个算法的程序就是下面的这个了:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct Number{
  int low;
  int high;
  int sum;
};
Number Find_Max_Crossing_Subarray(int num[25],int low,int mid,int high ){
     Number cross;
     int leftsum=0,rightsum=0,maxright,maxleft;
     int sum=0;
     for(int i=mid;i>low;i--){
        sum=sum+num[i];
        if(sum>leftsum){
            leftsum=sum;
            maxleft=i;
            }
     }
     sum=0;
     for(int i=mid+1;i<high;i++){
        sum=sum+num[i];
        if(sum>rightsum){
            rightsum=sum;
            maxright=i;
        }
     }
     cross.low=maxleft;
     cross.high=maxright;
     cross.sum=leftsum+rightsum;
     return cross;
}
Number Find_Maxmum_Subarray(int num[25],int low,int high){
     Number endo;
     Number left,right,cross;
     int mid;
     if(high==low){
        endo.low=low;
        endo.high=high;
        endo.sum=num[low];
        return endo;
     }
     else if(high==low+1){
        if(num[low]<0&&num[high]>0){
        endo.low=high;
        endo.high=high;
        endo.sum=num[high];
        }
        else if(num[low]>0&&num[high]<0){
        endo.low=low;
        endo.high=low;
        endo.sum=num[low];
        }
        else if(num[low]>0&&num[high]>0){
        endo.low=low;
        endo.high=high;
        endo.sum=num[low];
        }
        else if(num[low]<0&&num[high]<0&&num[low]<num[high]){
        endo.low=high;
        endo.high=high;
        endo.sum=num[high];
        }
        else {
        endo.low=low;
        endo.high=low;
        endo.sum=num[low];
        }
        return endo;
     }
     else {mid=(low+high)/2;}
    left=Find_Maxmum_Subarray(num,low,mid);
    right=Find_Maxmum_Subarray(num,mid,high);
    cross=Find_Max_Crossing_Subarray(num,low,mid,high);
    if(left.sum>=right.sum&&left.sum>=cross.sum){
       endo=left;
    }
    else if(right.sum>=left.sum&&right.sum>=cross.sum){
        endo=right;
    }
    else {endo=cross;}
    return endo;
     cout<<endo.high<<endl<<endo.low<<endl<<endo.sum;
}
int main()
{
    Number cross,jk;
    ifstream infile;;
    ofstream outfile;
    int num[25],i=0;
    infile.open("number.txt");
    while(infile>>num[i]){
        i++;
    }
    infile.close();
    //cross=Find_Max_Crossing_Subarray(num,0,(i-1)/2,i-1);
    jk=Find_Maxmum_Subarray(num,0,i-1);
    //cout<<cross.high<<endl<<cross.low<<endl<<cross.sum;
   cout<<jk.high<<endl<<jk.low<<endl<<jk.sum;
    return 0;
}//总结,这个算法巧妙的使用到了递归,我觉得递归这个东西十分难以掌握。但是使用好了之后看起来还是十分有奇效的

在这个算法的实现过程中。遇到了几个问题。

1.进行文件读取的时候,为了不让我申请的栈空间浪费,我想要使用指针操作,但是遇到了困难。无论我把申请地址的new操作放在什么地方,delete放在什么地方。总是会出现错误。想不明白其中的原由,当我知道怎么弄 的时候,我再来完善我的这个文章。

2.书本上的算法忽略了一个问题,就是当low+1=high 的时候,这个时候还需要进行一次判断,不然的话这个递归的终点是不明确的。但是我进行这个判断的语句写了好多,不知道是不是有一些地方我没有注意。

3.我觉得我比较成功的地方在于我想到了使用结构体来跟进书本上写的伪代码。或许这就是结构体使用的好处了。另外的一点就是我想到了类中的函数和这种函数的区别以及一些功能上的优劣。类中的函数对于多个返回值其实操作十分简单,就是把你想要返回的数值进行私有变量的定义,然后就是私有变量的赋值了自然是十分简洁的。但是这样一来也许就无法进行递归了?我可能有些地方没有想明白。我还真的没有再类中进行过递归~~~

猜你喜欢

转载自www.cnblogs.com/kaixiang-liu/p/8999072.html