Работа с массивами

Svetlanka_87

Новичок
Работа с массивами

Доброй ночи, Господа!

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

вот пример:

Массив (из 10 чисел): 5 -7 1 2 -3 8 -7 7 -5 4

Подмассив с максимальной суммой будет: 1 2 -3 8 -7 7 его сумма равна= 8


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

может быть кто-нибудь знает, как можно это сделать линейно ну или хотя бы снизить сложность до логарифмической. Заранее спасибо.

вот мой алгоритм:

PHP:
$max = $a[1]; //макс сумма
$sum = $a[1]; //текущая сумма
$max_l = 1; //левая граница
$max_r = 1; //правая граница


for ($i=1;$i<(n-1);$i++)
{
    for($j=2;$j<=n;$j++)
    {
      $sum=$sum+$a[$j];
      if($sum>=$max_temp) 
                   {
                        $max_temp=$sum;
                        $max_temp_r=$j;
                   }

    }
if($max_temp>$max)
                  {
                       $max=$max_temp;
                       $max_l=$i;
                       $max_r=$max_temp_r;
                  }
}
 

Adelf

Administrator
Команда форума
Да нет.. я просто глупость написал :) не так понял задачу.

Простой поиск в Яндексе:

http://forum.shelek.ru/index.php?action=printpage;topic=1206.0 - в конце вариант решения на С.

Чето там еще выпадает. Говорят стандартная собеседная задачка...
 

Svetlanka_87

Новичок
Автор оригинала: Adelf
Да нет.. я просто глупость написал :) не так понял задачу.

Простой поиск в Яндексе:

http://forum.shelek.ru/index.php?action=printpage;topic=1206.0 - в конце вариант решения на С.

Чето там еще выпадает. Говорят стандартная собеседная задачка...
Спасибо огромное!!!!
 

baev

‹°°¬•
Команда форума
Массив (из 10 чисел): 5 -7 1 2 -3 8 -7 7 -5 4

Подмассив с максимальной суммой будет: 1 2 -3 8 -7 7 его сумма равна= 8
— это как?
Если взять «подмассив» только из положительных чисел, сумма явно будет больше.
Что понимается под «подмассивом»?
 

dimagolov

Новичок
под «подмассивом» судя по всему понимается последовательность элементов основного массива с индексами от k до m, 0 <= k <= m < length

-~{}~ 03.12.09 17:51:

в такой трактовке подмассивов длинной 1 будет L, длиной 2 L-1, ... длиной L только один, то есть всего (L^2 + L) / 2 шт.
 

baev

‹°°¬•
Команда форума
1. То есть, элементы «подмассива» должны в массиве по порядку идти? Или что?

2. Последовательность "1 2 -3 8" тоже даёт сумму "8".
Как и последовательность "8"…

Svetlanka_87, поясните, плиз, что такое «подмассив».
 

Adelf

Administrator
Команда форума
Да. по порядку.

Подмассив - это какаято часть массива... какбэ полученный функцией, аналогичной substr.
 

Svetlanka_87

Новичок
Автор оригинала: baev
1. То есть, элементы «подмассива» должны в массиве по порядку идти? Или что?

2. Последовательность "1 2 -3 8" тоже даёт сумму "8".
Как и последовательность "8"…

Svetlanka_87, поясните, плиз, что такое «подмассив».
Подмассив в данном случае это часть подряд идущих элементов массива (сам подмассив также является подмассивом)

Пр:

Массив: 1 5 4 7 1 2 4 5
Подмассив с максимальной суммой в данном случае будет весь массив, сумма всех элементов которого равна = 29

Массив: -4 1 -2 4 5 -3 1
Подмассив с максимальной суммой: 4 5 его сумма равна 9

Массив: -4 5 -2 4 5 -3 1
Подмассив с максимальной суммой: 5 -2 4 5 так как его сумма равна 12





ЗЫ прошу прощения за задержку с ответом))
 

Adelf

Administrator
Команда форума
9 -4 1 -2 4 5

неужели задание так сложно для понимания? :)
Здесь вся проблема в отрицательных числах. А алгоритм просто до безобразия.
 

baev

‹°°¬•
Команда форума
— извиняюсь, не тот пример привёл.

Я так и не увидел ответа на вот этот вопрос:
Последовательность "1 2 -3 8" тоже даёт сумму "8".
Как и последовательность "8"…
— мне совершенно не понятно, чем предпочтительней вариант топикстартера.
По какому критерию был выбран именно «подмассив» 1 2 -3 8 -7 7?
 

e2site

Новичок
Автор оригинала: baev
— мне совершенно не понятно, чем предпочтительней вариант топикстартера.
По какому критерию был выбран именно «подмассив» 1 2 -3 8 -7 7?
В задаче не было ограничений по длине под массива следовательно оба варианты будут правильными.
 

Svetlanka_87

Новичок
Автор оригинала: baev
— а что будет в случае
9 -4 1 -2 4 5 -3 1
?
Здесь ответом будет подмассив: 9 -4 1 -2 4 5 - с суммой = 13

-~{}~ 06.12.09 14:38:

Автор оригинала: baev
— извиняюсь, не тот пример привёл.

Я так и не увидел ответа на вот этот вопрос:

— мне совершенно не понятно, чем предпочтительней вариант топикстартера.
По какому критерию был выбран именно «подмассив» 1 2 -3 8 -7 7?
Что касается этого вопроса, то e2site прав, ограничений нет, поэтому будет верен и вариант:
1 2 -3 8
и вариант: 2 -3 8 -7 7

все зависит от написанного алгоритма, мною просто был приведен пример внештатной ситуации))

-~{}~ 06.12.09 14:40:



может быть кто-нибудь знает, как можно это сделать линейно ну или хотя бы снизить сложность до логарифмической. Заранее спасибо.


Так что насчет самого алгоритма?:))
 

dimagolov

Новичок
Svetlanka_87, Adelf давал ссылку, там был код на С, который вроде как правильный (хотя и не ищет все варианты решения, но по идее его можно научить, а еще там мааленькая синтаксическая ошибка для фильтрации дураков)
 
Сверху