Top N max/min values
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
Top N max/min values
Пусть есть задача, по моему достаточно хрестоматийная, взять Top max N значений массива длиной M
можно конечно квиксортнуть и взять топ, но логика подсказывает можно сделать быстрее чем o ( N * Log N)
Создаем отсортированный массив длиной N и идем по основному, если значение больше минимального в отсортированном, вставляем, а нижнее выкидываем, т.е. при N << M сложность стремится к o(N)
Вопрос - есть ли этот алгоритм в стандартных библеотеках (LINQ)
можно конечно квиксортнуть и взять топ, но логика подсказывает можно сделать быстрее чем o ( N * Log N)
Создаем отсортированный массив длиной N и идем по основному, если значение больше минимального в отсортированном, вставляем, а нижнее выкидываем, т.е. при N << M сложность стремится к o(N)
Вопрос - есть ли этот алгоритм в стандартных библеотеках (LINQ)
-
- Уже с Приветом
- Posts: 803
- Joined: 24 Jan 2007 07:32
- Location: Сергели->Новосибирск->SFBA->Новосибирск->Москва->NY->SFBA
Re: Top N max/min values
1. Если идет проход по основному массиву длины M то сложность будет M*N, в этом случае я не пойму чем это лучше просто последовательной выборки максимального элемента (partial select sort).OtherSide wrote: ↑22 May 2018 09:17 Пусть есть задача, по моему достаточно хрестоматийная, взять Top max N значений массива длиной M
можно конечно квиксортнуть и взять топ, но логика подсказывает можно сделать быстрее чем o ( N * Log N)
Создаем отсортированный массив длиной N и идем по основному, если значение больше минимального в отсортированном, вставляем, а нижнее выкидываем, т.е. при N << M сложность стремится к o(N)
Вопрос - есть ли этот алгоритм в стандартных библеотеках (LINQ)
2. Насколько я понимаю ваша задача сводится к следующей проблеме - find the kth smallest element in an unordered list.
Зная этот элемент можно разделить массив по этому элементу.
3. Eсли брать С++ то в стандарте есть такой метод std::nth_element.
Думаю если посмотреть на шаблонный код можно конвертировать его в C# код.
4. Я лично не знаю эффективного эквивалента. В LINQ обычно идет простая итерация по интерфейсу IEnumerable, нет произвольного доступа к массиву.Вопрос - есть ли этот алгоритм в стандартных библеотеках (LINQ)
Спи быстрее, твоя подушка нужна другому. Copyright Зощенко
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
Re: Top N max/min values
Отнюдь. Вставка в отсортированный массив это log(m), да и то вставлять надо будет далеко не всегда, максимум будет при отстортированном в обратную сторону
-
- Уже с Приветом
- Posts: 549
- Joined: 07 Jan 2016 13:04
Re: Top N max/min values
Я думал, что чтение из сортированного массива - log n, а вставка дорогое удовольствие. Что-то поменялось? ))
-
- Уже с Приветом
- Posts: 12262
- Joined: 20 Dec 2000 10:01
- Location: Bellevue, WA
-
- Уже с Приветом
- Posts: 549
- Joined: 07 Jan 2016 13:04
-
- Уже с Приветом
- Posts: 12262
- Joined: 20 Dec 2000 10:01
- Location: Bellevue, WA
Re: Top N max/min values
это и есть сортированный массив, и вставка туда log(n)
-
- Уже с Приветом
- Posts: 12017
- Joined: 08 Sep 2006 20:07
- Location: Силиконка
Re: Top N max/min values
Min (for max elements) heap of size n.
Никаких сортировок.
Никаких сортировок.
Мир Украине. Свободу России.
-
- Уже с Приветом
- Posts: 12017
- Joined: 08 Sep 2006 20:07
- Location: Силиконка
Re: Top N max/min values
Кстати, если про C++ говорить, то чтобы заменить минимальный элемент bubble_down ручками писать придётся.
Строго говоря, это будет быстрее, чем pop_heap & push_heap.
Строго говоря, это будет быстрее, чем pop_heap & push_heap.
Мир Украине. Свободу России.
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
Re: Top N max/min values
и как это будет на Linq?
-
- Уже с Приветом
- Posts: 12017
- Joined: 08 Sep 2006 20:07
- Location: Силиконка
Re: Top N max/min values
Сорри, я Dweller-у, отвечал, на его "сортировки". Что сортировать ничего для priority queue не надо.
Про Linq ничего не знаю.
Мир Украине. Свободу России.
-
- Уже с Приветом
- Posts: 12262
- Joined: 20 Dec 2000 10:01
- Location: Bellevue, WA
Re: Top N max/min values
причем тут сортировка? priority queue и делается с помощью heapM. Ridcully wrote: ↑23 May 2018 17:29Сорри, я Dweller-у, отвечал, на его "сортировки". Что сортировать ничего для priority queue не надо.
Про Linq ничего не знаю.
-
- Уже с Приветом
- Posts: 12017
- Joined: 08 Sep 2006 20:07
- Location: Силиконка
Re: Top N max/min values
Ну да, я это и хотел сказать.
Выше просто чего-то про "сортированный массив" было, я как раз и хотел написать, что никаких сортированных массивов не нужно.
Почитал повыше - может, это и не вам...
Мир Украине. Свободу России.
-
- Уже с Приветом
- Posts: 3000
- Joined: 14 Apr 2004 01:11
- Location: SFBA (было: Минск, Беларусь)
Re: Top N max/min values
Квиксортнуть и взять топ будет O( M * Log M)
Задача решается алгоритмом, который похож на квиксорт по своей структуре, но не занимается лишней работой, т.е. 1) не сортирует больше, чем надо, 2) не обрабатывает заведомо ненужный "хвост" массива.OtherSide wrote:Создаем отсортированный массив длиной N и идем по основному, если значение больше минимального в отсортированном, вставляем, а нижнее выкидываем, т.е. при N << M сложность стремится к o(N)
Сначала выполняем классический partitioning из квиксорта. Пусть после partitioning правая половина массива содержит R значений.
* Если R == N, то вся правая половина - искомый результат. Стоп.
* Если R < N, то вся правая половина массива входит в наши искомые значения. Далее рекурсивно применяем этот же алгоритм к левой половине массива для поиска недостающих N-R максимальных значений.
* Если R > N, то левая половина нас больше не интересует. Рекурсивно применяем этот же алгоритм к правой половине для поиска N максимальных значений.
На каждом уровне делается только один рекурсивный вызов (а не два, как в квиксорте), т.е. алгоритм натурально цикличен. Сложность в среднем - O(M).
Однако если заведомо известно, что N << M, то из практических соображений лучше подойдет именно ваш алгоритм. Не составит труда интегрировать его в вышеприведенный алгоритм для решения подзадач именно при условии N << M.
Best regards,
Андрей
Андрей
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
Re: Top N max/min values
Да неохота что то интегрировать, изобретать велосипед. Реализация тривиальная, неужели нет готового? Ну или хотя бы правильное название задачи, что бы нагуглить чей то гитхаб или код на stackoverflow