![]() |
|
![]() ![]() ![]() |
|
IL3 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 11.3.2007 Репутация: нет Всего: нет |
Расскажите пожалуйста идею алгоритма. Не сомневаюсь, что задача довольно проста, но я ведь
еще только учусь... P.S Разумеется алгоритм должен работать не за O(N * N), а за O(N * logN). |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
IL3, какого алгоритма? каких инверсий?
|
|||
|
||||
IL3 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 11.3.2007 Репутация: нет Всего: нет |
Пусть задана последовательность целых чисел a[1],a[2],...,a[n], все числа в ней различны и находятся в промежутке [1..n]. Инверсия - это такая последовательность индексов 0 < i < j < n + 1, что a[i] > a[j].
А алгоритм должен искать эти самые инверсии в массиве. |
|||
|
||||
MBo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 10.6.2002 Репутация: 5 Всего: 18 |
модифицируй сортировку слиянием
|
|||
|
||||
SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Создаем массив из элементов вида
Далее сортируем массив по zn слиянием. Потом уже ищем инверсии в получившемся массиве по position. Т.е. берем первый элемент и от него двигаемся далее пока выполяняется условие инверсии. Как только перестает выполняться переходим ко второму элементу и так далее. -------------------- Всем добра ![]() |
|||
|
||||
esperant0 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 714 Регистрация: 20.5.2005 Репутация: 4 Всего: 14 |
Количество инверисий квадратично.
Интересно как вы найдете их все быстрей чем за квадратичную сложность. опыт подсказывает, что это невозможно. -------------------- Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором а затем стерто и которое он - пользователь не мог видеть. |
|||
|
||||
SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
А! точно! Мы это в конце первого семестра по Линейке прошли... Слушай, esperant0. А можно посчитать сложность моего алгоритма? Я в сложностях не силен ![]() -------------------- Всем добра ![]() |
|||
|
||||
esperant0 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 714 Регистрация: 20.5.2005 Репутация: 4 Всего: 14 |
Сортировка слиянием nlgn А дальше когда идет поиск инверсий, в худшем случае, когда массив упорядочен в обратном порядке, понадобиться (n^2)/2 сравнений -------------------- Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором а затем стерто и которое он - пользователь не мог видеть. |
|||
|
||||
MBo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 10.6.2002 Репутация: 5 Всего: 18 |
esperant0,
>А дальше когда идет поиск инверсий инверсии нужно искать не после, а во время сортировки слиянием. Если мы обнаруживаем в старшем сливаемом сегменте меньшее число, чем в младшем, то сразу не на единицу число инверсий увеличиваем, а на длину дистанции, за счет этого и достигается асимптотика нужная |
|||
|
||||
esperant0 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 714 Регистрация: 20.5.2005 Репутация: 4 Всего: 14 |
Еще раз. Количество инверсий n^2 Каким образом вы обеспечите ассимптотику nlgn? -------------------- Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором а затем стерто и которое он - пользователь не мог видеть. |
|||
|
||||
Akina |
|
||||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
SoWa дал правильный алгоритм, только сам в нем запутался:
Т.е. O(N*N) получаем не на стадии просчета (там честные O(N*logN)), а на стадии вывода результата.
Какое может быть "перестает выполняться"? массив ОТСОРТИРОВАН!
Когда "массив упорядочен в обратном порядке", следует поправить код, сменив сортировку по возрастанию на сортировку по убыванию (или наоборот). -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
MBo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 10.6.2002 Репутация: 5 Всего: 18 |
esperant0,
Я понял задачу как подсчет количества инверсий, а не вывод инверсионных пар. |
|||
|
||||
AndreySUrSU |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 22.4.2007 Репутация: нет Всего: нет |
Еще есть простой алгоритм кроме сортировки слиянием...
С помощью дерева отрезков.. Вначале проходим по массиву и добавляем все числа в дерево... Потом за второй проход подсчитываем и удаляем текущий элемент из дерева... Дерево отрезков позволяет узнать количество элементов меньших а[i] в дереве... Это работает за NLogN если не надо выводить элементы...А выводить - это маразм... Тогда никакой эффективности не надо.. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |