Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск инверсий в массиве. 
:(
    Опции темы
IL3
  Дата 1.4.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.3.2007

Репутация: нет
Всего: нет



Расскажите пожалуйста идею алгоритма. Не сомневаюсь, что задача довольно проста, но я ведь
еще только учусь...
P.S Разумеется алгоритм должен работать не за O(N * N), а за O(N * logN).

PM MAIL   Вверх
Bitter
Дата 1.4.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 4
Всего: 27



IL3, какого алгоритма? каких инверсий?
PM MAIL ICQ Skype   Вверх
IL3
Дата 1.4.2007, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.3.2007

Репутация: нет
Всего: нет



Пусть задана последовательность целых чисел a[1],a[2],...,a[n], все числа в ней различны и находятся в промежутке [1..n]. Инверсия - это такая последовательность индексов 0 < i < j < n + 1, что a[i] > a[j].
А алгоритм должен искать эти самые инверсии в массиве.
PM MAIL   Вверх
MBo
Дата 2.4.2007, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 5
Всего: 18



модифицируй сортировку слиянием
PM MAIL   Вверх
SoWa
Дата 2.4.2007, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Создаем массив из элементов вида
Код

type Element=record
position: integer; //Позиция элемента изначально
zn: integer; //Содержимое элемента.
end;

Далее сортируем массив по zn слиянием. Потом уже ищем инверсии в получившемся массиве по position. Т.е. берем первый элемент и от него двигаемся далее пока выполяняется условие инверсии. Как только перестает выполняться переходим ко второму элементу и так далее.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
esperant0
Дата 2.4.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Количество инверисий квадратично.


Интересно как вы найдете их все быстрей чем за квадратичную сложность.


опыт подсказывает, что это невозможно.




--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
SoWa
Дата 2.4.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Цитата(esperant0 @  2.4.2007,  19:49 Найти цитируемый пост)
Количество инверисий квадратично.

А! точно! Мы это в конце первого семестра по Линейке прошли...
Слушай, esperant0. А можно посчитать сложность моего алгоритма? Я в сложностях не силен smile


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
esperant0
Дата 2.4.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(SoWa @ 2.4.2007,  20:15)
Цитата(esperant0 @  2.4.2007,  19:49 Найти цитируемый пост)
Количество инверисий квадратично.

А! точно! Мы это в конце первого семестра по Линейке прошли...
Слушай, esperant0. А можно посчитать сложность моего алгоритма? Я в сложностях не силен smile

Сортировка слиянием nlgn

А дальше когда идет поиск инверсий, в худшем случае, когда массив упорядочен в обратном порядке, понадобиться (n^2)/2 сравнений


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
MBo
Дата 3.4.2007, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 5
Всего: 18



esperant0
>А дальше когда идет поиск инверсий
инверсии нужно искать не после, а во время сортировки слиянием.  Если мы обнаруживаем в старшем сливаемом сегменте меньшее число, чем в младшем, то сразу не на единицу число инверсий увеличиваем, а  на длину дистанции, за счет этого и достигается асимптотика нужная
PM MAIL   Вверх
esperant0
Дата 3.4.2007, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(MBo @ 3.4.2007,  04:57)
esperant0
>А дальше когда идет поиск инверсий
инверсии нужно искать не после, а во время сортировки слиянием.  Если мы обнаруживаем в старшем сливаемом сегменте меньшее число, чем в младшем, то сразу не на единицу число инверсий увеличиваем, а  на длину дистанции, за счет этого и достигается асимптотика нужная

Еще раз.

Количество инверсий n^2

Каким образом вы обеспечите ассимптотику nlgn?




--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
Akina
Дата 3.4.2007, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



SoWa дал правильный алгоритм, только сам в нем запутался:
  • Двумеризуем массив, т.е. a[i] -> a[a[i],i]
  • Выполняем сортировку по первому индексу (читай - исходному массиву). O(N*logN).
  • Далее в один проход получаем все пары. А вот тут никуда не деться, O(N*N). Вернее так: это не количество сравнений, которое O(N), это количество записей в выходной поток пар инверсии будет O(N*N).

Т.е. O(N*N) получаем не на стадии просчета (там честные O(N*logN)), а на стадии вывода результата.


Цитата(SoWa @  2.4.2007,  10:04 Найти цитируемый пост)
Т.е. берем первый элемент и от него двигаемся далее пока выполяняется условие инверсии. Как только перестает выполняться переходим ко второму элементу и так далее. 

Какое может быть "перестает выполняться"? массив ОТСОРТИРОВАН!

Цитата(esperant0 @  2.4.2007,  21:22 Найти цитируемый пост)
в худшем случае, когда массив упорядочен в обратном порядке, понадобиться (n^2)/2 сравнений 

Когда "массив упорядочен в обратном порядке", следует поправить код, сменив сортировку по возрастанию на сортировку по убыванию (или наоборот).



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
MBo
Дата 3.4.2007, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 5
Всего: 18



esperant0
Я понял задачу как подсчет количества инверсий, а не вывод инверсионных пар.
PM MAIL   Вверх
AndreySUrSU
Дата 22.4.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 22.4.2007

Репутация: нет
Всего: нет



Еще есть простой алгоритм кроме сортировки слиянием...
С помощью дерева отрезков..
Вначале проходим по массиву и добавляем все числа в дерево...
Потом за второй проход подсчитываем и удаляем текущий элемент из дерева...
Дерево отрезков позволяет узнать количество элементов меньших а[i] в дереве...
Это работает за NLogN если не надо выводить элементы...А выводить - это маразм...
Тогда никакой эффективности не надо..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1097 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.