![]() |
|
![]() ![]() ![]() |
|
HMLd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 27.6.2006 Где: Polska Репутация: нет Всего: 0 |
Дае масив длинной n. Какой есть оптимальный по быстродействию алгоритм поиска 3 максимальных элементов? Банальные модификации BubbleSort не предлагать. И второе, вроде как в STL в какои-то контейнере реалтзован такой алгоритм. Подскажете?
|
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Прямой поиск -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Peter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 28.7.2003 Где: Ставрополь Репутация: нет Всего: 1 |
std::set. В нем элементы отсортированы. -------------------- всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23). |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Модифицируй BFPRT. сложность O(n)
http://en.wikipedia.org/wiki/Selection_algorithm А проще всего конечно написать прямой поиск. |
|||
|
||||
MaxPayneC |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 18.2.2006 Репутация: нет Всего: 9 |
Три раза найти максимум - сложность O(n).
Отсортировать и взять три последних - сложность O(n * ln n) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
зачем? запоминаем три текущих максимума, берём следующий элемент и сравниваем с минимаксом. Один проход. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
не в контейнере, а в алгоритмах: partial_sort -------------------- ... |
|||
|
||||
HMLd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 27.6.2006 Где: Polska Репутация: нет Всего: 0 |
Akina, и сколько придётся сделать сравнений?
MaxPayneC, если три раза - сложность O(3 * n). Во-вторых, как помечать элементы, которые уже максимальны? Ограничений на диапазон нет, так что не получится просто напримео присвоить 1. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
HMLd |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 27.6.2006 Где: Polska Репутация: нет Всего: 0 |
Akina, не знаю. Наверное туплю. Можно пример на каком-нить языке? Или хотя бы словесное описание алгоритма.
|
|||
|
||||
Peter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 28.7.2003 Где: Ставрополь Репутация: нет Всего: 1 |
Поскольку в std::set элементы отсортированы, то там и будем хранить три максимальных элемента.
1. Берем три первых элемента массива и складываем их в std::set (назовем объект set3). 2. Цикл от 4-го элемента массива и до последнего: 2.1. если он меньше минимального из set3 (*set3.begin()), идем дальше; 2.2. иначе удаляем из set3 минимальный элемент (set3.erase(set3.begin())) и складываем туда текущий из массива. Добавлено через 1 минуту и 12 секунд Итого в 2.1 одно сравнение и в 2.2, возможно, еще два сравнения. -------------------- всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23). |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Akina,
По моему вы ошибаетесь сравнений понадобиться в лучшем случае N в худшем 3*N
|
|||
|
||||
esperanto |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 31.5.2003 Репутация: 2 Всего: 4 |
Нет. --------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET |
|||
|
||||
MaxPayneC |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 18.2.2006 Репутация: нет Всего: 9 |
O(n) = O(3 * n) по определению символов Ландау. Не путайте асимптотическую сложность и константу алгоритма. По теме: изящнее реализации Pavia я придумать не могу, за исключением того, что начинать имеет смысл от третьего, а не от нулевого элемента, и сравнений в худшем случае будет действительно 3n. |
|||
|
||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
я бы нашел максимальный элемент в массиве, а потом бы перебрал массив и удалил бы это значение... так 3 раза, а сам поиск макс. значения будет быстрый (в большом массиве).... и имеется ввиду что простой перебор массива тоже быстрый? если да, то операция быстрая должна получится...
т.е. в таком случае новый массив(ы), хэш не надо создавать...
(может быть как-то можно еще, именно 3 последние вывести сразу... а не по одному) пример сочинил от сюда http://www.opennet.ru/docs/RUS/perl_obzor/...s/quantium.html Это сообщение отредактировал(а) gcc - 7.3.2010, 11:39 |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Это не так. Имея 4 значения, можно составить математическое выражение, которое даёт одно из 16 возможных значений в зависимости от того, как распределяются эти значения в результате сортировки (ещё проще - получить номер имнимального), после чего использовать предопределённые команды переприсвоения из массива. При этом явно будет использовано ровно 1 сравнение на каждом этапе (более того, можно обойтись вообще без явных сравнений). Впрочем, это не влияет на сложность алгоритма - он получается гарантированно линейным O(n). -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Alexk553 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 8.11.2009 Репутация: нет Всего: нет |
на какой машитне это будет исполняться? если это обычный современный х86, то есть смысл думать о параллельном алгоритме под 64 разрядную архитектуру, думать о кешировании внутри процессора, если же под виртуальную джава или дотнет машину, то нужно смотреть какие там есть команды,
и для правильного ответа надо знать, насколько отличается задержка и скорость чтения из ОЗУ от скорости чтения процессорных регистров, а если задача имеет чисто академический интерес, то гораздо гемморнее будет доказывать оптимаьность алгоритма, чем его придумываение. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
я начинаю думать, что нужен какой-то механизм для выделения ответов, чтобы они были более заметны
![]() уже десяток посто назад был дан ответ: ну и на вопрос "как он устроен?" - тоже:
Это сообщение отредактировал(а) maxim1000 - 15.12.2010, 09:46 -------------------- qqq |
|||
|
||||
Silent |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: 1 Всего: 9 |
Мне лично больше по вкусу рецепт Peter'a, просто и со вкусом:
Легко перенести на случай Х максимальных, к тому же за один проход массива О(N). Единственное замечание - для предложенной реализации элементы массива должны быть уникальны. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |