Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск 3 максимальных в массиве 
:(
    Опции темы
HMLd
Дата 1.3.2010, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дае масив длинной n. Какой есть оптимальный по быстродействию алгоритм поиска 3 максимальных элементов? Банальные модификации BubbleSort не предлагать. И второе, вроде как в STL в какои-то контейнере реалтзован такой алгоритм. Подскажете?
PM MAIL   Вверх
Akina
Дата 1.3.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(HMLd @  1.3.2010,  15:25 Найти цитируемый пост)
Какой есть оптимальный по быстродействию алгоритм поиска 3 максимальных элементов?

Прямой поиск


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

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


Опытный
**


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

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



Цитата(HMLd @  1.3.2010,  14:25 Найти цитируемый пост)
вроде как в STL в какои-то контейнере реалтзован такой алгоритм

std::set. В нем элементы отсортированы.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Pavia
Дата 1.3.2010, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Модифицируй BFPRT. сложность O(n)
http://en.wikipedia.org/wiki/Selection_algorithm

А проще всего конечно написать прямой поиск. 
PM MAIL   Вверх
MaxPayneC
Дата 1.3.2010, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Три раза найти максимум - сложность O(n).
Отсортировать и взять три последних - сложность O(n * ln n)
PM   Вверх
Akina
Дата 1.3.2010, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(MaxPayneC @  1.3.2010,  21:52 Найти цитируемый пост)
Три раза найти максимум

зачем? запоминаем три текущих максимума, берём следующий элемент и сравниваем с минимаксом. Один проход.



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

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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(HMLd @  1.3.2010,  15:25 Найти цитируемый пост)
И второе, вроде как в STL в какои-то контейнере реалтзован такой алгоритм. Подскажете? 

не в контейнере, а в алгоритмах: partial_sort


--------------------
...
PM   Вверх
HMLd
Дата 3.3.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Akina, и сколько придётся сделать сравнений?
MaxPayneC, если три раза - сложность O(3 * n). Во-вторых, как помечать элементы, которые уже максимальны? Ограничений на диапазон нет, так что не получится просто напримео присвоить 1.
PM MAIL   Вверх
Akina
Дата 3.3.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(HMLd @  3.3.2010,  15:34 Найти цитируемый пост)
 и сколько придётся сделать сравнений?

Ровно N.


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

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


Шустрый
*


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

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



Akina, не знаю. Наверное туплю. Можно пример на каком-нить языке? Или хотя бы словесное описание алгоритма.
PM MAIL   Вверх
Peter
Дата 3.3.2010, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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).
PM MAIL WWW   Вверх
Pavia
Дата 3.3.2010, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Akina
Цитата(Akina @  3.3.2010,  14:39 Найти цитируемый пост)
Ровно N.

По моему вы ошибаетесь сравнений понадобиться в лучшем случае N в худшем 3*N 
Код

m1=a[0];
m2=a[2];
m3=a[3];
if (m1>m2)  swap(m1,m2);
if (m2>m3)  swap(m2,m3);
if (m1>m2)  swap(m1,m2);

for(i=0;i<Length(A);i++){
if  (A[i]>m1) {
  m1=A[i];
 if (m1>m2)  {
     swap(m1,m2);
    if (m2>m3)  swap(m2,m3);
   }
 }
}

PM MAIL   Вверх
esperanto
Дата 6.3.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Akina @ 3.3.2010,  14:39)
Цитата(HMLd @  3.3.2010,  15:34 Найти цитируемый пост)
 и сколько придётся сделать сравнений?

Ровно N.

Нет.
--------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET
PM MAIL   Вверх
MaxPayneC
Дата 7.3.2010, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(HMLd @  3.3.2010,  14:34 Найти цитируемый пост)
MaxPayneC, если три раза - сложность O(3 * n).

O(n) = O(3 * n) по определению символов Ландау. Не путайте асимптотическую сложность и константу алгоритма.

По теме: изящнее реализации Pavia я придумать не могу, за исключением того, что начинать имеет смысл от третьего, а не от нулевого элемента, и сравнений в худшем случае будет действительно 3n.
PM   Вверх
gcc
Дата 7.3.2010, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



я бы нашел максимальный элемент в массиве, а потом бы перебрал массив и удалил бы это значение... так 3 раза, а сам поиск макс. значения будет быстрый (в большом массиве).... и имеется ввиду что простой перебор массива тоже быстрый? если да, то операция быстрая должна получится...
т.е. в таком случае новый массив(ы), хэш не надо создавать...

Код

#!/usr/bin/perl

use Quantum::Superpositions;
my @a = (1,2,3,4,5,6,7,12,9,10);      # integers
print  eigenstates(  any(@a ) >= all(@a)  );

(может быть как-то можно еще,  именно 3 последние вывести сразу... а не по одному)

пример сочинил от сюда http://www.opennet.ru/docs/RUS/perl_obzor/...s/quantium.html

Это сообщение отредактировал(а) gcc - 7.3.2010, 11:39
PM WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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