Re: коммивояжёр

From
Oleg Khovayko ()
To
Vitaly Lugovsky
Date
2003-01-15T04:55:46Z
Area
RU.ALGORITHMS
.n5080.z2.fidonet.ftn>
From: Oleg Khovayko <olegh@hotpop.com>

Vitaly Lugovsky wrote:

> 
>  Не годится контрпример - ведь это решение представимо в виде рекурсии.

Пожалуйста, давайте не будем заниматься демагогией и втихаря подменять 
тему дискуссии. Ведь дискуссия началась в Вашего утверждения:
<<
   Это не болтовня, это факт. Любой алгоритм в рекуррентной форме
представляется гораздо лучше, и анализировать (в том числе и автоматически)
его удобнее.
 >>
Иными словами, Вы утверждали, что не существует алгоритмов,
которые удобнее было бы представлять и анализировать в
нерекурентной форме. Теперь же Вы говорите о представимости -
то есть принципиальной возможности представить - невзирая на
"трудозатраты". Про представимость - я и никогда не спорил.
Да, конечно, все представимо. Вопрос - какими силами?

Продолжим на счет моего контрпримера. Да, рекурентно
можно написать алгоритм, но толку то!
Попробуйте проанализировать этот Ваш рекурентный алгоритм,
и доказать его вычислительную сложность.
Я уверяю, что будет существенно больше, чем O(N*N*K).
А итерационный алгоритм дает именно такое
решение, и анализ его тривиален. И кодируется он в десять
строчек - в прямом смысле слова.

Так и быть, привожу решение:

int NumWays(int I, int J, int K, vector< vector<int> > matrix) {
   vector<int> V(N);
   V[I] = 1;
   while(K--)
     V *= matrix; // тут векторное произведение вектора на матрицу
   return V[J];
}

Вектороное произведение - два вложеных цикла по N, то есть N*N.
Все это выполняется К раз. Итого время выполнения O(N*N*K).
Дополнительной памяти - 2*N ячеек. ВСЕ.

Теперь: рекурентное описание с анализом - в студию!
Сравним понятность/краткость/возможность анализа.

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

Смотрите выше. Попробуйте рекурентно это представить проще.

А вот еще один пример:
Есть дерево. Задача: обойти дерево по слоям.
Я утверждаю, что существует итеративное решение этой задачи,
пропорциональное N, то есть каждый узел дерева посещается один раз.

Рекуррентный алгоритм - в студию!
А потом я дам итерационный...

--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)