задачка
От: kittown  
Дата: 23.06.05 15:51
Оценка:
Hi!

Задачку придумал для любителей сочинять алгоритмы. Что-то
все кому ни дам, никто работоспособного алгоритма не дает
(т.е. дают быстрые но ошибочные). Не пойму, она
действительно что ли сложная ?

Исходные данные: матрица NxN, содержит числа. Надо найти
прямоугольник внутри оной матрицы, сумма числел в котором
была бы максимальна (размеры прямоугольника неизвестны).
Параллельные алгоритмы неинтересны, они точно есть на гугле.

Очевидно, что решение не может быть быстрее N^2 (по числу
элементов). Требуется найти алгоритм сложности не
медленнее N^3 (мой) и узнать, возможны ли более быстрые.

Для нагула идей имеет смысл решить одномерный вариант
задачи, когда выбирается (непрерывный) подмассив
одномерного массива с максимальной суммой элементов
за линейное время (эту задачку можно найти на гугле).

Mikhail
Posted via RSDN NNTP Server 1.9
Re: задачка
От: Аноним  
Дата: 23.06.05 16:02
Оценка:
Здравствуйте, kittown, Вы писали:

K>Hi!


K>Задачку придумал для любителей сочинять алгоритмы. Что-то

K>все кому ни дам, никто работоспособного алгоритма не дает
K>(т.е. дают быстрые но ошибочные). Не пойму, она
K>действительно что ли сложная ?

K>Исходные данные: матрица NxN, содержит числа. Надо найти

K>прямоугольник внутри оной матрицы, сумма числел в котором
K>была бы максимальна (размеры прямоугольника неизвестны).
K>Параллельные алгоритмы неинтересны, они точно есть на гугле.

K>Очевидно, что решение не может быть быстрее N^2 (по числу

K>элементов). Требуется найти алгоритм сложности не
K>медленнее N^3 (мой) и узнать, возможны ли более быстрые.

K>Для нагула идей имеет смысл решить одномерный вариант

K>задачи, когда выбирается (непрерывный) подмассив
K>одномерного массива с максимальной суммой элементов
K>за линейное время (эту задачку можно найти на гугле).

K>Mikhail


решение
Автор: Quintanar
Дата: 28.10.04
Re[2]: задачка
От: wildwind Россия  
Дата: 23.06.05 16:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>решение
Автор: Quintanar
Дата: 28.10.04


Это только частный случай.
Re[2]: задачка
От: kittown  
Дата: 23.06.05 16:26
Оценка:
wrote:
>
> K>Исходные данные: матрица NxN, содержит числа. Надо найти
> K>прямоугольник внутри оной матрицы, сумма числел в котором
> K>была бы максимальна (размеры прямоугольника неизвестны).
> K>Параллельные алгоритмы неинтересны, они точно есть на гугле.
>
> K>Очевидно, что решение не может быть быстрее N^2 (по числу
> K>элементов). Требуется найти алгоритм сложности не
> K>медленнее N^3 (мой) и узнать, возможны ли более быстрые.
> решение

Это решение не той задачи.

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

Mikhail
Posted via RSDN NNTP Server 1.9
Re: задачка
От: Кодт Россия  
Дата: 23.06.05 17:25
Оценка:
Здравствуйте, kittown, Вы писали:

K>Исходные данные: матрица NxN, содержит числа. Надо найти прямоугольник внутри оной матрицы, сумма числел в котором была бы максимальна (размеры прямоугольника неизвестны).


Лобовое решение.

Пусть s(x,y1,y2) — сумма элементов в строках y1..y2 столбца x.
Если мы зафиксируем (y1,y2) — получится последовательность s(x).
За один проход (та самая разминочная подзадача) найдём (x1,x2) для которых сумма S(x1,x2,y1,y2) = sum s(x1)..s(x2) максимальна.
Очевидно, что нахождение s(x,y1,y2) тупым способом требует O(N) времени, так что на один проход мы потратим O(N^2).
Количество разных сочетаний y1,y2 — это C(N,2) = N*(N-1)/2, то есть на перебор всего-всего нам потребуется O(N^4).

Вроде бы, правильный алгоритм?

Его можно очевидным способом улучшить, разогнав до O(N^3).
(Это я крикнул "Первый, блин! (комом)" )
Перекуём баги на фичи!
Re: задачка
От: McSeem2 США http://www.antigrain.com
Дата: 23.06.05 17:41
Оценка:
Здравствуйте, kittown, Вы писали:

K>Для нагула идей имеет смысл решить одномерный вариант

K>задачи, когда выбирается (непрерывный) подмассив
K>одномерного массива с максимальной суммой элементов
K>за линейное время (эту задачку можно найти на гугле).

Одномерный вариант я как-то раз делал.
http://www.rsdn.ru/Forum/Message.aspx?mid=887390&only=1
Автор: McSeem2
Дата: 06.11.04


Можно попробовать применить нечто похожее и для матрицы, используя вместо start, end прямоугольник (x1,y1, x2,y2). Ну и вложенный цикл по x,y. Впрочем не уверен в успехе.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: задачка
От: _DAle_ Беларусь  
Дата: 23.06.05 18:09
Оценка:
Здравствуйте, kittown, Вы писали:

K>Hi!


K>Задачку придумал для любителей сочинять алгоритмы. Что-то

K>все кому ни дам, никто работоспособного алгоритма не дает
K>(т.е. дают быстрые но ошибочные). Не пойму, она
K>действительно что ли сложная ?

Нет, и ты не первый ее придумал

K>Исходные данные: матрица NxN, содержит числа. Надо найти

K>прямоугольник внутри оной матрицы, сумма числел в котором
K>была бы максимальна (размеры прямоугольника неизвестны).
K>Параллельные алгоритмы неинтересны, они точно есть на гугле.

K>Очевидно, что решение не может быть быстрее N^2 (по числу

K>элементов). Требуется найти алгоритм сложности не
K>медленнее N^3 (мой) и узнать, возможны ли более быстрые.

K>Для нагула идей имеет смысл решить одномерный вариант

K>задачи, когда выбирается (непрерывный) подмассив
K>одномерного массива с максимальной суммой элементов
K>за линейное время (эту задачку можно найти на гугле).

K>Mikhail


Самое лобовое решение слудующее:
Одномерный вариант будем использовать в качестве подзадачи.
Затем заполним дополнительный массив
B[i][j] = Сумма элементов i-ой строки исходного массива от 1 до j элемента.

Сложность построения этой матрицы O(n^2).
С помощью нее можно за константное время узнать сумму элементов в i-ой строке в интервале [j,k]
B[i][k]-B[i][j-1] (нулевой столбец заполнен нулями)

Теперь просто переберем все варианты расположения левой и правой границы прямоугольника (O(n^2) вариантов). И для каждого расположения решим линейную задачу с помощью построенной матрицы B. Получим алгоритм со сложностью O(n^3).
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: задачка
От: raskin Россия  
Дата: 23.06.05 18:17
Оценка:
kittown wrote:
> Hi!
>
> Задачку придумал для любителей сочинять алгоритмы. Что-то
> все кому ни дам, никто работоспособного алгоритма не дает
> (т.е. дают быстрые но ошибочные). Не пойму, она
> действительно что ли сложная ?
>
> Исходные данные: матрица NxN, содержит числа. Надо найти
> прямоугольник внутри оной матрицы, сумма числел в котором
> была бы максимальна (размеры прямоугольника неизвестны).
> Параллельные алгоритмы неинтересны, они точно есть на гугле.
>
> Очевидно, что решение не может быть быстрее N^2 (по числу
> элементов). Требуется найти алгоритм сложности не
> медленнее N^3 (мой) и узнать, возможны ли более быстрые.
>
> Для нагула идей имеет смысл решить одномерный вариант
> задачи, когда выбирается (непрерывный) подмассив
> одномерного массива с максимальной суммой элементов
> за линейное время (эту задачку можно найти на гугле).

Недавно эта задача была у друга на программировании на мехмате..
Я ему за небольшое время кинул идею.. Он это написал,
оттестировал, сдал. Задача, как мне кажется, простая.
Про более быстрые алгоритмы не думал, но вряд ли они
есть. Ваш алгоритм — это ведь перебирать пары (left,right)
и искать для каждой из них ответ за O(N)?
Posted via RSDN NNTP Server 1.9
Re[2]: задачка
От: raskin Россия  
Дата: 23.06.05 18:19
Оценка:
_DAle_ wrote:
> Здравствуйте, kittown, Вы писали:
>
> K>Hi!
>
> K>Задачку придумал для любителей сочинять алгоритмы. Что-то
> K>все кому ни дам, никто работоспособного алгоритма не дает
> K>(т.е. дают быстрые но ошибочные). Не пойму, она
> K>действительно что ли сложная ?
>
> Нет, и ты не первый ее придумал

Извините, не заметил сразу..
Posted via RSDN NNTP Server 1.9
Re[2]: задачка
От: kittown  
Дата: 23.06.05 22:47
Оценка:
_DAle_ wrote:
>
> K>Hi!
>
> K>Задачку придумал для любителей сочинять алгоритмы. Что-то
> K>все кому ни дам, никто работоспособного алгоритма не дает
> K>(т.е. дают быстрые но ошибочные). Не пойму, она
> K>действительно что ли сложная ?
>
> Нет, и ты не первый ее придумал

Я и не говорил что первый. Но гуглом нашел только параллельные
алгоритмы.

> Самое лобовое решение слудующее:

> Одномерный вариант будем использовать в качестве подзадачи.
> Затем заполним дополнительный массив
> B[i][j] = Сумма элементов i-ой строки исходного массива от 1 до j элемента.
>
> Сложность построения этой матрицы O(n^2).
> С помощью нее можно за константное время узнать сумму элементов в i-ой
> строке в интервале [j,k]
> B[i][k]-B[i][j-1] (нулевой столбец заполнен нулями)
>
> Теперь просто переберем все варианты расположения левой и правой границы
> прямоугольника (O(n^2) вариантов). И для каждого расположения решим
> линейную задачу с помощью построенной матрицы B. Получим алгоритм со
> сложностью O(n^3).

Да, алгоритм близок, мой только тратит меньше памяти. Без создания
дополнительного массива, с использованием информации предыдущего
шага.

Итого вывод — с местными (не в смысле рсдн) господами задачки
решать неинтересно.

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

Mikhail
Posted via RSDN NNTP Server 1.9
Re[2]: задачка
От: kittown  
Дата: 23.06.05 22:50
Оценка:
raskin wrote:

> Ваш алгоритм — это ведь перебирать пары (left,right)

> и искать для каждой из них ответ за O(N)?

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

Mikhail
Posted via RSDN NNTP Server 1.9
Re: задачка
От: Nikolaus Россия  
Дата: 30.06.05 07:13
Оценка:
Здравствуйте, kittown, Вы писали:

K>Hi!


K>Задачку придумал для любителей сочинять алгоритмы. Что-то

K>все кому ни дам, никто работоспособного алгоритма не дает
K>(т.е. дают быстрые но ошибочные). Не пойму, она
K>действительно что ли сложная ?

K>Исходные данные: матрица NxN, содержит числа. Надо найти

K>прямоугольник внутри оной матрицы, сумма числел в котором
K>была бы максимальна (размеры прямоугольника неизвестны).
K>Параллельные алгоритмы неинтересны, они точно есть на гугле.

K>Очевидно, что решение не может быть быстрее N^2 (по числу

K>элементов). Требуется найти алгоритм сложности не
K>медленнее N^3 (мой) и узнать, возможны ли более быстрые.

K>Для нагула идей имеет смысл решить одномерный вариант

K>задачи, когда выбирается (непрерывный) подмассив
K>одномерного массива с максимальной суммой элементов
K>за линейное время (эту задачку можно найти на гугле).

Это классика. Как раз за куб и решается.
... << Rsdn@Home 1.1.4 beta 1 >>
Re[2]: задачка
От: kittown  
Дата: 30.06.05 07:15
Оценка:
Nikolaus wrote:
>
> Это классика. Как раз за куб и решается.

С кубом разобрались. Интересен вопрос более
быстрых решений — как определить, возможны
или невозможны.

Mikhail
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.