![]() |
|
![]() ![]() ![]() |
|
killobyte |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 1.9.2010 Репутация: нет Всего: нет |
Требуется найти k максимальных чисел в массиве длиной n.
Сложность алгоритма должна быть меньше O(nlogn) Это сообщение отредактировал(а) killobyte - 11.9.2010, 22:22 |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 5 Всего: 121 |
Например эффективный алгоритм выбора (selection algorithm). Пример описан здесь: http://blogs.msdn.com/b/devdev/archive/200.../18/514482.aspx
Сложность будет O(n + klogk) < O(nlogn) в большинстве практических случаев. При k == n/2 (что в большинстве случаев в пределах практически значимых задач) функция сложности для обоих случаев выглядит следующим образом: ![]() Хотя в конечно счёте многое будет зависеть от ваших n и реализации самого алгоритма. Достаточно подробно и хорошо эта проблема рассмотрена также у Кормена в книге "Алгоритмы. Построение и анализ". -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
killobyte |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 1.9.2010 Репутация: нет Всего: нет |
спасибо большое, почитаю книгу.
|
|||
|
||||
esperanto |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 31.5.2003 Репутация: 2 Всего: 4 |
"Сложность будет O(n + klogk) < O(nlogn) в большинстве практических случаев"
Формула не верная и лишенная смысла. --------------------- А решение простое, находите к-ую порядковую статистику. И все элементы ее большие и есть вашь ответ Время работы линейное Добавлено через 4 минуты и 9 секунд Статистика находиться за линейное время, без всяких там к лог (к) --------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 5 Всего: 121 |
esperanto, K статистика находится за O(n), это верно. А если требуется найти K максимальных не идущих подряд? Ну скажем необходимо взять K чётных максимальных. Тогда будет O(k/2*n) = O(n) чтоли?
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 4 Всего: 101 |
знаете линейный алгоритм? хотелось бы увидеть. W4FhLF прав насчет O(n + klogk). Идея - (частичная) сортировка k элементов множества. Partial sort называется. http://www.lsi.upc.edu/~conrado/research/talks/aofa04.pdf |
||||
|
|||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 5 Всего: 121 |
Ну вообще линейный алгоритм для k-ой статистики есть. Например вот: http://www.rawkam.com/?p=870 Частичная сортировка необязательнй, перестановки в любом случае необходимы. Это сообщение отредактировал(а) W4FhLF - 13.9.2010, 16:13 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 4 Всего: 101 |
по ссылке алгоритм partial sort, который в худшем случае дает n^2. Линейное время будет в среднем случае (на случайных данных).
|
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 5 Всего: 121 |
baldina, в главе "9.3 Алгоритм выбора с линейным временем работы в наихудшем случае", Кормен, Алгоритмы. Построение и анализ.
Цитата, стр. 250:
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 4 Всего: 101 |
Кормен, насколько я понимаю, ссылается на алгоритм BFPRT. А совсем не то, что по ссылке выше.
|
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 5 Всего: 121 |
Ты вроде просил привести пример линейного алгоритма? Вот это были примеры.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 4 Всего: 101 |
спасибо
|
|||
|
||||
esperanto |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 31.5.2003 Репутация: 2 Всего: 4 |
У случайного алгоритма нет худшего случая. Добавлено через 1 минуту и 32 секунды A worst-case linear algorithm for the general case of selecting the kth largest element was published by Blum, Floyd, Pratt, Rivest and Tarjan in their 1973 paper "Time bounds for selection", sometimes called BFPRT after the last names of the authors. It is based on the quickselect algorithm and is also known as the median-of-medians algorithm. Although quickselect is linear-time on average, it can require quadratic time with poor pivot choices (consider the case of pivoting around the smallest element at each step). The solution to make it O(n) in the worst case is to consistently find "good" pivots. A good pivot is one for which we can establish that a constant proportion of elements fall both below and above it. The Select algorithm divides the list into groups of five elements. (Left over elements are ignored for now.) Then, for each group of five, the median is calculated (an operation that can potentially be made very fast if the five values can be loaded into registers and compared). (If sorting in-place, then these medians are moved into one contiguous block in the list.) Select is then called recursively on this sublist of n/5 elements to find their true median. Finally, the "median of medians" is chosen to be the pivot. Добавлено через 3 минуты и 5 секунд
Вы сами себе противоречите то просите алгоритм Быстрее чем O(nlogn) То говорите согласен и на большее. Кроме всего прочего ПОВТОРЮ термин быстрее чем O(nlogn) лишен смысла --------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET |
||||||||
|
|||||||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 4 Всего: 101 |
У случайного алгоритма есть случайный результат ![]()
ок, лучше, чем O(nlogn), меньше, чем O(nlogn). Удовлетворил? и не говорил я, что согласен на большее. а про BFPRT мы знаем, я же упоминал его... вот зацепились за моё "знаете линейный алгоритм". вижу, знаете. вот был бы известен алгоритм, не только приближающийся к теоретической оценке, но и достаточно простой для применения на практике... те слова к этому относились. |
||||
|
|||||
esperanto |
|
||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 31.5.2003 Репутация: 2 Всего: 4 |
Нет. Лучше яем О(nlog n) не бывает. И меньше не бывает. Для справки О(nlog n) это множество функции, приведу несколько элементов этого множества const, loglog n, log n,sqrt(n),n, n+log n Добавлено через 2 минуты и 2 секунды
У случайного алгоритма результат не случайный а правильный. И быстрая сортировка ,никогда не вернет вам неверный неотсортированный массив. Думаю стоит разобраться в вероятностных алгоритмах. Методах их анализа, и критериев сходимости и концентрации ошибок. --------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET |
||||||||||
|
|||||||||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |