wizzard: (Default)
[personal profile] wizzard

уважаемые товарищи!

а почему все считают, что сортировка произвольных данных inplace может выполняться за N log(N), если с 1985 1978 года у нас есть модификация бинарного поиска, работающая за log(log(N))?

ведь тогда, даже если взять банальную сортировку вставкой, асимптотика должна быть N*log(log(N)), или я чего-то недопонимаю?

UPD: блин, сортировка вставкой ведь еще двигать элементы должна, а в связном списке interpolation search невозможен.. надо сделать вариант Library sort и померять.

UPD2: а вот и N log log N сортировка от Yijie Han – yijie.han-loglogn-sort.pdf, спасибо [livejournal.com profile] 184467440737095 за наводку. Надо бы реализовать и потестить))

Date: 2010-06-18 10:55 pm (UTC)
From: [identity profile] slobin.livejournal.com
Потому что первое -- оценка в худшем случае, а второе -- в среднем.

... Спой, Мэглор-скиталец, балладу мне ...

Date: 2010-06-18 11:01 pm (UTC)
From: [identity profile] slobin.livejournal.com
Хотя, если спросить "почему в среднем не получается"... Кажется, в этом же журнале уже был очень похожий вопрос, собрал довольно большую дискуссию. Там даже вычислительный эксперимент провели. Но формулировку вопроса я забыл. ;-) Сейчас, попробую сочинить иллюстрацию.

... cilre fo lo se srera ...

Date: 2010-06-18 11:04 pm (UTC)
From: [identity profile] slobin.livejournal.com
Существует метод с гарантированным n*log(n) (метод пирамиды).

... noi ja'orgau ke'a lenu ke'a zekri te relsmu ...

Date: 2010-06-18 11:04 pm (UTC)
From: [identity profile] bik-top.livejournal.com
Сомножитель log(log(N)) — это поиск места вставки. Сама же вставка предполагает сдвиг части отсортированных элементов вправо, а это есть N.

Date: 2010-06-18 11:05 pm (UTC)
From: [identity profile] the-aaa13.livejournal.com
Не то, чтобы в среднем, так как вероятностное распределение не заданно. Просто при (разумном) предположении эквидистантности. Зато в худшем случае можно и N^2 в сортировке заработать, что уж совсем не комильфо.

Date: 2010-06-18 11:10 pm (UTC)
From: [identity profile] slobin.livejournal.com
В статье по ссылке распределение как раз задано: оно должно быть равномерным. Я очень сильно подозреваю (почти уверен), что для множества всех промежуточных результатов при методе вставки оно не соблюдается (даже если предположить, что таковым был исходный массив). Ну была же здесь уже аналогичная задачка... Проклятый эклер! :-(

... Identical to supernatural ...

Date: 2010-06-18 11:11 pm (UTC)
From: [identity profile] slobin.livejournal.com
Нет. Формальная "академическая" постановка задачи изменяет именно число сравнений, игнорируя все служебные операции. И я сильно подозреваю, что всё равно ничего хорошего не получится.

... Intrat et exit ut nil supra ...

Date: 2010-06-18 11:18 pm (UTC)
From: [identity profile] slobin.livejournal.com
О! Точно! Я это осознал, спутав термины: перепутал Radix Sort и Library Sort. ;-) Radix Sort вообще работает за линейное время, но у него основная операция -- НЕ сравнение, а выделение и сравнение отдельных цифр. Может быть, я был не прав, и на самом деле при условии равномерности распределения входных данных (то есть, грубо говоря, мы априори знаем, что примерно половина чисел лежит в интервале [0.0;0.5], а половина в [0.5;1.0]) тот же самый трюк сработает и на сравнениях.

... У Краггаша нет ни единого шанса! ...

Date: 2010-06-18 11:25 pm (UTC)
From: [identity profile] bik-top.livejournal.com
Проверил: у Кнута и у Кормена-Лейзерсона-Ривеста «нормальный» рассчёт асимптотики, а не «академический».

Date: 2010-06-18 11:35 pm (UTC)
From: [identity profile] slobin.livejournal.com
Нет, не может, чушь порю. Стандартное доказательство того, что в худшем случае требуется не менее n*log(n) сравнений: элементы исходного массива могут быть переставлены n! (эн факториал) разными способами. Чтобы узнать, какой их этих способов правильный, мы должны задать не менее log_2(n!) бинарных вопросов. Из оценок для факториала (формула Стирлинга) получаем как раз n*log(n). Так что зря я на чудо понадеялся. ;-)

P.S. Ещё раз, это важно: подсчитываются (считаются за одно элементарное действие) сравнения, то есть операции, смотрящие на два числа и выдающие один бит информации. Если за одно элементарное действие считать что-то другое (например сравнение отдельных разрядов чисел), то результат будет другим. Но, поскольку поиск интерполяциями основан именно на сравнениях, результат к нему применим. А пересылки вообще не считаются.

... Октябрьский эль моделируется вином из одуванчиков ...

Date: 2010-06-18 11:42 pm (UTC)
From: [identity profile] slobin.livejournal.com
В данном случае не важно: я утверждаю, что даже сравнений (игнорируя пересылки) потребуется не менее n*log(n) в худшем случае. Учёт пересылок может только ухудшить оценку. Это называется "энтропийная оценка": чтобы отсортировать массив, нам нужно добыть откуда-то не менее n*log(n) бит информации. Если единственным источником информации является сравнение на больше-меньше, то вот столько их и будет. Если разрешены другие источники информации (например, выделение отдельных битов из данных), то будет вот столько обращений к этим другим источникам.

... Какой я математик? Я флюктуация. ...

Date: 2010-06-18 11:45 pm (UTC)
From: [identity profile] slobin.livejournal.com
Он, увы, не линейный. Ну то есть он линейный по размеру массива и линейный по длине элементов массива в битах, так что получается то же n*log(n). Я неаккуратно употребил слово в предыдущем комментарии.

... Transiit, quasi dolor, nox ...

Date: 2010-06-18 11:50 pm (UTC)
From: [identity profile] slobin.livejournal.com
Хорошее наблюдение, да! А если мы априори знаем, что входной массив состоит из целых чисел от 1 до 10, то и результат сортировки можно просто взять и выписать. ;-)

... Одним движением бесшумно скользящего рычага ...

Date: 2010-06-18 11:54 pm (UTC)
From: [identity profile] slobin.livejournal.com
Ну и, с учётом выше (но позже!) сказанного, почему равномерность распределения всё-таки может помочь: если мы заведомо знаем, что элемент 0.99 не может оказаться в первой половине массива, то возможных перестановок сразу становится меньше.

... Я очень уважаю Леонида Андреевича ...

Date: 2010-06-19 12:07 am (UTC)
From: [identity profile] slobin.livejournal.com
Всё, сплю на ходу. В рамках этой дискуссии я насчитал уже, кажется, три (или больше?) существенно разных постановки задачи. И я сам их периодически путаю, пытаясь применить к одной результаты от другой. Получается чушь. :-( Прошу прощения, пошёл спать.

... Поймите меня хотя бы неправильно ...

Date: 2010-06-19 06:35 am (UTC)
From: [identity profile] nicka-startcev.livejournal.com
(цинично) Существует метод с гарантированным o(N), но у него есть ряд неприятных особенностей.

Date: 2010-06-19 07:19 am (UTC)
From: [identity profile] thedeemon.livejournal.com
> то же n*log(n)

Если n - число элементов, то с их размером оно не связано. Откуда здесь логарифм?

Date: 2010-06-19 07:39 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Враки.

Date: 2010-06-19 08:02 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Предположение, что все элементы массива различны, и что массив содержит все возможные элементы, безосновательно. А без такого предположения связи между размером элементов и их числом нет.
Давайте будем сортировать строки, например.

Date: 2010-06-19 08:22 am (UTC)
From: [identity profile] slobin.livejournal.com
Больше -- не меньше. Если я знаю, что весь массив состоит только из нулей и единиц, я сортирую его за линейное время.

... Сундук в паутине лихой голосил ...

Date: 2010-06-19 08:37 am (UTC)
From: [identity profile] kodt-rsdn.livejournal.com
Потому что NlogN - для любых абстрактных данных, над которыми определена операция сравнения.
А если мы знаем что-то большее, - например, что это целые числа, - то можем найти и более эффективные решения. Тот же радикс или подсчёт.

Date: 2010-06-19 08:38 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Правильно, и никакого логарифма там не будет.

Date: 2010-06-19 08:56 am (UTC)
From: [identity profile] 184467440737095.livejournal.com
а еще как-то вот так можно.
http://portal.acm.org/citation.cfm?id=509993

Date: 2010-06-19 05:05 pm (UTC)
From: [identity profile] nicka-startcev.livejournal.com
А это у всех методов зависит.

Если диапазон сравнительно небольшой, а элементов сравнительно много, то o(A)+o(B) будет намного быстрее, чем o(log(A))+o(A). (A - число элементов, B - диапазон).

Profile

wizzard: (Default)
wizzard

January 2019

S M T W T F S
  12 345
6789101112
1314 1516171819
202122 23242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 25th, 2026 10:11 pm
Powered by Dreamwidth Studios