Re: Алгоритм
- From
- Andrew Ezhguroff ()
- To
- Alexey Desyatnik
- Date
- 2002-10-09T00:58:14Z
- Area
- RU.ALGORITHMS
From: "Andrew Ezhguroff" <eandr@com2com.ru>
Привет! "Alexey Desyatnik" <desyatnik@dax.ru> сообщил(а):
AD> Вопреки предлагаемому массив сортировать НЕ надо.
Ошибаешься.
AD> Почему? При неотсортированном массиве алгоритм очевиден -
AD> перебор с ограничением (в худшем случае будем сравнивать
AD> каждый элемент с каждым). Сложность алгоритма О((m*n)^2).
Ага.
AD> Теперь рассмотрим сортировку - неважно какой алгоритм.
AD> Линейного-то все равно не существует, в лучшем случае
AD> O(n*log(n)). Сортировать придется каждую строку (или
AD> столбец), т.е. для всей матрицы поимеем сложность уже
AD> O(m*n*log(n)) (или, соотв., O(n*m*log(m))). Далее,
AD> рассмотрим худший случай, например (после сортировки):
AD> 1 2 3 4
AD> 5 6 7 8
AD> 9 10 11 11
AD> Каждую строку надо просмотреть на наличие двух соседних
AD> элементов (т.е. сложность поднимается _еще_ на m*n,
AD> имеем в результате _уже_ сложнее полного перебора)
А вот здесь уже ошибаешься: O(m*n*ln(n))+O(m*n) равно O(m*n*ln(n)), что
много меньше, чем O(m*n*m*n) полного перебора.
AD> кроме того, надо учесть и возможности вроде
AD> 1 2 3 4
AD> 5 6 7 8
AD> 4 9 10 11
AD> Дальше, думаю, рассматривать не стоит... :)
Стоит. Сортировать надо не матрицу A[m, n], а ВЕКТОР A[m*n]. В этом случае
сортировка займет O(m*n*ln(m*n)), а поиск - O(m*n). Что в сумме дает
O(m*n*ln(m*n)) - опять много меньше, чем O(m*n*m*n).
С уважением, Андрей.
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
* Origin: Talk.Mail.Ru (2:5020/400)