2015-12-20 4 views
0

Мне нужно немного намека на реализацию этого алгоритма в C. Это проблема с максимальным подмассивом. Я сделал программу полиномиального времени, а также программу линейного времени. Я новичок в C, поэтому я не знаю, как вернуть несколько значений из функции, как этого требует этот алгоритм. Например, эта строка в алгоритме (слева-слева, слева-вверх, левая-сумма) = НАЙТИ-МАКСИМАЛЬНАЯ СУБРАРИВАЯ (A, низкая, средняя), где FIND-MAX-SUBARRAY (A, низкий, средний) является вызовом рекурсивной функции.Возврат кортежа из функции в C

Это алгоритм из coremen:

Algorithm from coremen

Ниже я поставил глобальных переменных кросс-низкий, кросс-высокий, кросс-сумму. Как я могу сделать то же самое для left-low, left-high, left-sum и right-low, right-high, right-sum?

#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 
+0

Вы должны включить всю необходимую информацию ** в ** Вы сомневаетесь текст. Не просто отправляйте ссылки! – Olaf

ответ

-1

Функция вычисляет 3 различных индикаторов для набора аргументов, существует несколько способов, чтобы вернуть несколько результатов:

  • добавить дополнительные аргументы, по одному для каждого в качестве указателей на int или любого другого типа. Храните результаты косвенно в переменных, адреса которых были переданы вызывающим абонентом перед возвратом кода завершения.

  • добавить дополнительный аргумент функции, указатель на структуру с одним членом на результат и заполнить эту структуру, прежде чем вернуть код успеха вызывающему.

  • вернуть такую ​​структуру по стоимости. Этот подход менее выражен в C, поскольку он не был частью первоначальной спецификации pre-Ansi C. Это было давно, более 30 лет, но многие программисты все еще неодобрительно относятся к ним. Другим недостатком этого подхода является то, что вы не можете легко вернуть индикацию отказа. Как видно из собственного использования OP этого решения, это может привести к очень неэффективным методам кодирования.

  • выделить структуру результатов и вернуть указатель на вызывающего абонента. Вы можете указать отказ, возвращая NULL, но он менее информативен, чем код ошибки. Жизненный цикл этой структуры подвержен ошибкам: этот указатель может потеряться, если возвращаемое значение не будет сохранено, в соответствующее время необходимо принять его в free.

Возвращение таких результатов через глобальные переменные, безусловно, не является хорошим решением по причинам, объясняемым в других ответах. Второй вариант выше - тот, который я бы рекомендовал.

+4

Я действительно считаю, что для ясности использование структуры в этом случае является лучшим выбором, чем использование массивов и необходимость отслеживать «какой индекс означает, что снова?» вопросы. –

+0

@BobJarvis: Я согласен на 100%, я ответил на вопрос, когда он появился вообще, до того, как OP включил код. Позвольте мне перефразировать это. – chqrlie

4

Вы можете достичь цели, указав структуру, используя ключевое слово 'struct', которое будет содержать три переменные, которые вы собираетесь вернуть. Для этого добавьте определение структуры в разделе заголовка вашей c-программы.

typedef struct left { 
    int left_low; 
    int left_high; 
    int left_sum; 
}LEFT; 

Определить переменную типа СЛЕВА в основной (или там, где вы хотите его использовать) Примечание. Тип возврата вашего FIND-MAXIMUM-SUBARRAY будет LEFT. Вам также необходимо передать переменную 'stleft' в функцию FIND-MAXIMUM-SUBARRAY.

LEFT stleft; 

Выделяют память stleft

stleft = malloc(sizeof(LEFT)); 

Присвоить значения должны быть возвращены, в переменную "stleft"

stleft.left_low = max_left; 
stleft.left_high = max_left; 
stleft.left_sum = left_sum + right_sum; 

Вернуться переменная

return stleft; 

Доступ left_low в stleft

int newvar1; 
newvar1 = stleft.left_low; 

Для структур больше помощи подстановок C

+0

Я пробовал! – FibonacciCoder

+0

Перекрестная функция устанавливает глобальную переменную cross (cross_low, cross_high, cross_sum) правильно. Я должен сделать это для других глобальных переменных слева и справа, чтобы я мог их сравнить! – FibonacciCoder

+0

Объявите три глобальных структуры: одну для «креста», одну для «левой» и одну для «правой». Передайте структуры в свою рутину и верните модифицированную структуру. Измените значения в структуре вместо изменения глобальных переменных 'cross_low' и т. Д. Желаем удачи. –

Смежные вопросы