Сортировка
, Сложность N*logN
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [18.97.9.169] |
|
|
правила раздела Алгоритмы

Сортировка
, Сложность N*logN
|
Сообщ.
#1
,
|
|
|
|
На прямой дано N отрезков с координатами (a[i]; b[i]). 1<=i<=N. Найти максимальное k, для которого существет точка на прямой, покрытая k отрезками. За N*logN операций
|
|
Сообщ.
#2
,
|
|||
|
|
Вот такой вариант:
Правда тут используется быстрая сортировка, которая в наихудшем случае дает сложность N^2. Просто не вспомнил запись алгоритма древесной сортировки (с максимальной сложностью N*logN). |
|
Сообщ.
#3
,
|
|||||
|
|
как говорил наш преподаватель я не компилятор напишите идею чтобы было понятно |
|
Сообщ.
#4
,
|
|
|
|
Честно говоря тоже не очень понял...
1.Отсортировали все концы отрезков в массив пар (координата, признак начала отрезка): 2.Двигаемся по етому массиву: 3.==Очередная координата имеет "признак начала"? 4.==Да. Увеличиваем число пересекающихся отрезков 5.====Число пересекающихся отрезков больше последнего запомненного? 6.====Да. Последнее запомненне = (координата, число отрезков) 7.====Нет. Пофих. 8.==Нет. Уменьшаем число пересекающихся отрезков. 9.Пока массив не кончится. |
|
|
|
|
|
А если рассмотреть вырожденный отрезок, т.е. точку, то при тестировании алгоритм иногда её считает почему-то, а иногда нет, т.к. сначала добавляет +1, а затем вычитает её приблизительно в том же месте или что-то вроде, т.е. точка засчитывается как 0-отрезок. А нужно считать её за реальный отрезок. Например,
1 11 2 12 3 6 3 3 1 7 3 7 1 2 3 3 Алгоритм должен выдать 7 отрезков. 3 3 Алгоритм должен выдать 1 отрезок. Как бы поаккуратнее исправить? Просто иногда алгоритм всё-таки считает такие отрезки. Если вспомню тест, выложу. |
|
Сообщ.
#6
,
|
|||||
|
|
Ну смотри, в той программе точки сортировались при помощи сранения pos[i]<x. А что бы считать вырожденные отрезки, этого сравненея недостаточно. Можно даже ввести функцию:
Тогда изменится и процедура sort, вот так:
|
|
Сообщ.
#7
,
|
|||
|
|
Понимаешь, albom, всё бы вроде бы хоршо, но на некоторых тестах сортировка, которую ты предлагаешь, даёт сбой. Уже при 6 отрезках есть много вариантов, где одно число при сортировке становится не на свое место. Например, 2 7 7 7 3 7 5 11 7 7 1 7 Результат: 1 2 3 7 5 7 7 7 7 7 7 11 Можно еще затестить варианты: 1 7 4 7 6 7 5 7 1 7 2 11 1 10 3 9 9 11 4 7 1 7 3 7 Даже есть варианты, когда получается совсем печально: 1 7 3 9 9 11 4 7 1 7 3 7 Результат: 1 1 3 3 7 4 7 9 9 7 7 11 Искать недочёт пока нет времени, я тут написал вещь пообъёмнее, но вроде работает корректно. В сформированном массиве упорядочиваются по убыванию флаги у одинаковых элементов массива Pos в процедуре flagsort, которая использует процедуру invsort-это quicksort по убыванию. Но это уже по сложности побольше, чем N*LogN, может быть можно оптимизнуть, ну, например, сделать одну quicksort, передавая в качестве параметра возраст. или убывание делать, и сам массив. Или доработать алгоритм albom'а.
|
|
Сообщ.
#8
,
|
|
|
|
Да вы чего
Если отрезки змкнутые (включают в себя свои концы), нужно при одинаковой координате первыми ставить начала отрезков, если открытые -- сначала ставить концы. И считать количество пересекшихся -- работает для любых, хоть трижды вырожденных отрезков. |
|
|
|
|
|
2Visitor: Ну поподробнее алгоритм можно? На том же pas'е или просто алгоритмически?
|
|
Сообщ.
#10
,
|
|||||
|
|
Паскаля под рукой нет. На Си -- вот: overlay.cpp
in.txt
|