Size: a a a

2020 October 12

EZ

Evgenii Zheltonozhsk... in pro.algorithms
Anatoly Tomilov
А что этим достигается, если сравнивать с std::set? Лучше константа, чем в случае std::set? От O(N log N) всё равно никуда не уйдёшь
если тебе надо допустим k<<N вставок/извлечений
источник

AT

Anatoly Tomilov in pro.algorithms
Evgenii Zheltonozhskii🇮🇱
если тебе надо допустим k<<N вставок/извлечений
std::partial_sort, если все они нужны только в конце один раз. А так — да, понятно. Могут быть случаи, когда на этом сэкономить можно.
источник

EZ

Evgenii Zheltonozhsk... in pro.algorithms
Anatoly Tomilov
std::partial_sort, если все они нужны только в конце один раз. А так — да, понятно. Могут быть случаи, когда на этом сэкономить можно.
Ну если в конце то да, а если динамично то нет
источник

m

magras in pro.algorithms
Anatoly Tomilov
В C++ есть std::make_heap, std::push_heap, std::pop_heap и std::sort_heap. А на практике эта куча вообще используется? Она хотя бы в одной задаче надобится? Такое впечатление, что она имеет только теоретический интерес.
На cppcon19 был классный доклад от Александреску об оптимизации std::sort, он там нашел необычное применение куче. =)

Кучу можно собрать на непрерывном куске памяти, что по сравнению с std::set уменьшит накладные расходы и должно улучшить локальность для небольших N. Но я тоже ни разу не пользовался std::make_heap.
источник

IB

Ivan Boldyrev in pro.algorithms
Anatoly Tomilov
В C++ есть std::make_heap, std::push_heap, std::pop_heap и std::sort_heap. А на практике эта куча вообще используется? Она хотя бы в одной задаче надобится? Такое впечатление, что она имеет только теоретический интерес.
Для организации priority queue. Я работаю над коммерческим проектом, где несколько вложенных heap, одна из которых — minmax heap.

А ещё heap пригождается, когда тебе нужно посчитать объединение/пересечение нескольких отсортированных последовательностей.
источник

A

Adamant in pro.algorithms
magras
На cppcon19 был классный доклад от Александреску об оптимизации std::sort, он там нашел необычное применение куче. =)

Кучу можно собрать на непрерывном куске памяти, что по сравнению с std::set уменьшит накладные расходы и должно улучшить локальность для небольших N. Но я тоже ни разу не пользовался std::make_heap.
А что в этом необычного? Heapify очень старая штука
источник

m

magras in pro.algorithms
Adamant
А что в этом необычного? Heapify очень старая штука
На сколько я помню, идея была в том, что make_heap выдает "слегка отсортированный" массив, что позволило улучшить локальность доступа при дальнейшей честной сортировке. Если это стандартный прием, я о таком никогда не слышал.
источник

AT

Anatoly Tomilov in pro.algorithms
magras
На сколько я помню, идея была в том, что make_heap выдает "слегка отсортированный" массив, что позволило улучшить локальность доступа при дальнейшей честной сортировке. Если это стандартный прием, я о таком никогда не слышал.
получается, что std;:make_heap(std::begin(container), std::end(container)); перед std::sort(std::begin(container), std::end(container)); — это оптимизация? Наверное только для небольших trivially copyable элементов
источник

A

Andrey in pro.algorithms
Интересно, зачем сортировать не trivially copyable элементы, если можно сортировать ссылки (или индексы) на них
источник

AT

Anatoly Tomilov in pro.algorithms
Andrey
Интересно, зачем сортировать не trivially copyable элементы, если можно сортировать ссылки (или индексы) на них
мой пойнт относится к кеш-локальности
источник

A

Andrey in pro.algorithms
Anatoly Tomilov
мой пойнт относится к кеш-локальности
Понятно
источник

CD

Constantine Drozdov in pro.algorithms
Anatoly Tomilov
получается, что std;:make_heap(std::begin(container), std::end(container)); перед std::sort(std::begin(container), std::end(container)); — это оптимизация? Наверное только для небольших trivially copyable элементов
это оптимизация для insertion sort, там надо внимательно смотреть, почему это вообще работает
источник

CD

Constantine Drozdov in pro.algorithms
я бы не удивился, если такой же эффект дал бы, скажем, один проход пузырьком
источник

m

magras in pro.algorithms
Anatoly Tomilov
получается, что std;:make_heap(std::begin(container), std::end(container)); перед std::sort(std::begin(container), std::end(container)); — это оптимизация? Наверное только для небольших trivially copyable элементов
По-моему Константин прав и это применялось уже на последнем этапе, когда размер блока после quick sort достиг порога перехода на линейную вставку. Порог скорее всего зависит в том числе и от размера элементов.

Но я могу врать в деталях - смотрел видимо ровно год назад.
источник

m

magras in pro.algorithms
Constantine Drozdov
я бы не удивился, если такой же эффект дал бы, скажем, один проход пузырьком
Думаешь просто потрогать данные было бы достаточно? Мне кажется, первый проход линейной вставки это и так сделает, разве нет?
источник

CD

Constantine Drozdov in pro.algorithms
ну это доклад александреску на cppcon кажись
источник

m

magras in pro.algorithms
Constantine Drozdov
ну это доклад александреску на cppcon кажись
Да, я же на него и ссылался.
источник

CD

Constantine Drozdov in pro.algorithms
magras
Думаешь просто потрогать данные было бы достаточно? Мне кажется, первый проход линейной вставки это и так сделает, разве нет?
думаю, что очень большой эффект мог быть от range check
источник

CD

Constantine Drozdov in pro.algorithms
мы примерно ln size раз в него бьемся, это не стоит ифа
источник

CD

Constantine Drozdov in pro.algorithms
можно более точно поизучать вопрос о количестве инверсий в массиве heap
источник