从C

时间:2015-12-20 15:10:12

标签: c

我需要一些提示在C中实现此算法。这是一个最大的子阵列问题。我已经制作了多项式时间程序和线性时间程序。我是C的新手,因此我不知道如何从函数中返回多个值,因为此算法需要它。例如算法中的这一行(左 - 低,左 - 高,左 - 和)= FIND-MAXIMUM-SUBARRAY(A,低,中)其中 FIND-MAX-SUBARRAY( A,低,中)是递归函数调用。

这是coremen的算法:

Algorithm from coremen

下面我设置了全局变量交叉低,交叉高,交叉和。我怎样才能为左 - 低,左 - 高,左和右 - 低,右 - 高,右和做同样的事情?

#include "max_subarray_common.h"
#define SENTINAL -3000

int left_low,left_high,left_sum;
int right_low,right_high,right_sum;
int cross_low,cross_high,cross_sum;


void max_crossing_subarray(int low,int mid,int high)
{
    int left_sum=SENTINAL;
    int sum=0;
    int max_left=low,max_right=high;
    for(int i=mid;i>=low;i--)
    {
        sum=sum+change[i];
        if(sum>left_sum)
        {
            left_sum=sum;
            max_left=i;
        }
    }
    int right_sum=0;
    sum=0;
    for(int j=mid+1;j<=high;j++)
    {
        sum=sum+change[j];
        if(sum>right_sum)
        {
            right_sum=sum;
            max_right=j;
        }
    }
    cross_low=max_left;
    cross_high=max_right;
    cross_sum=left_sum+right_sum;
}

这是我的头文件:

#ifndef max_subarray_h
#define max_subarray_h

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

extern int price[];
extern int n;
extern int change[];
extern int from;
extern int to;
extern int max;


void init_change();
void max_subarray_poly();
void max_subarray_crossing();
void max_subarray_rec();
void max_crossing_subarray();

#endif

change[]是要为其找到子数组的数组。我的输出也应如下所示:

from=8
to=11
maximum profit=43

1 个答案:

答案 0 :(得分:-1)

该函数为参数集计算3个不同的指标,有多种方法可以返回多个结果:

  • 添加额外的参数,每个结果一个,作为int的指针或更合适的任何类型。在返回完成代码之前,将结果间接存储到调用者已传递地址的变量中。

  • 为函数添加一个额外的参数,指向每个结果有一个成员的结构的指针,并在将成功代码返回给调用者之前填充此结构。

  • 按值返回这样的结构。这种方法在C中不那么惯用,因为它不是原始的Ansi C规范的一部分。这是很久以前的事了,超过30年,但许多程序员仍然不赞同。这种方法的另一个缺点是您无法轻松返回故障指示。从OP自己对此解决方案的使用可以看出,它可能导致编码实践效率低下。

  • 为结果分配结构并将指针返回给调用者。您可以通过返回NULL来指示失败,但它的信息量不如错误代码。这个结构的生命周期容易出错:如果没有存储返回值,这个指针可能会丢失,必须在适当的时候注意free它。

由于其他答案中解释的原因,通过全局变量返回此类结果绝对不是一个好的解决方案。上面的第二个选项是我建议的那个。