Re: Алгоритм
- From
- Evgenij Masherov (2:5020/175.2)
- To
- Alexey Desyatnik
- Date
- 2002-10-09T09:39:59Z
- Area
- RU.ALGORITHMS
From: "Evgenij Masherov" <EMasherow@nsi.ru>
Tue Oct 08 2002 20:26, Alexey Desyatnik wrote to Alexander Pashchenko:
>> Задали тут задачку:
>>
>> Дан массив A[m,n] Известно, что среди его эл-тов
>> всего 2 равны между собой. Напечатать их индесксы.
>>
>> Как ее правильно решить.
>>
>> Я так думаю, что надо проходить по матрице и сравнивать текущий элемент с
>> запомненным, исключая сам запомненный. И если они равны вывести индексы.
>> Но вот тут-то я и запутался.
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> имеем в результате _уже_ сложнее полного перебора)
AD> кроме того, надо учесть и возможности вроде
AD> 1 2 3 4
AD> 5 6 7 8
AD> 4 9 10 11
AD> Дальше, думаю, рассматривать не стоит... :)
AD> Сортировка (и тем более хэши) имеют смысл при
AD> структурах и задачах баз данных, но никак не
AD> числовых матриц (тем более, как я подозреваю,
AD> повторный поиск производиться не будет :)
Ну что ж, сравним...
Прежде всего - зачем обрабатывать каждую строку по отдельности? По условию -
два одинаковых элемента во всей матрице! При обработке строк по отдельности мы
скорее всего их пропустим...
Затем, делаем сортировку всей матрицы
O(m*n*log(m*n))
и один проход сравнения
O(m*n)
Полагая, что сортировка дает коэффициент сложности по сравнению с лобовой
реализацией 10 (что ИМХО сильно преувеличение) и принимая размерности матрицы
1000х1000, получим:
- лобовая реализация 10^12 операций
- через сортировку 10*10^6*6=6*10^6 или в примерно 200 000 раз быстрее...
Евгений Машеров АКА СанитарЖеня
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)