Viktor
Viktor
Порридж В Ко-ливинге
Viktor
Если тебе интересны всякие такие плюсовые штуки применительно к спортивному программированию, советую вот эту книгу https://cses.fi/book/book.pdf , там всякие алгоритмы и сразу с фишками для реализации
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Тут отлично видно, что heapsort КУЧУ времени тратит на создание самой КУЧИ
https://youtu.be/H5kAcmGOn4Q?t=255
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Наблюдения:
arr = [
...arr.slice(0, j),
arr[i],
...arr.slice(j, i),
...arr.slice(i + 1),
];
Очень дорогая операция, и никак не оптимизируется
Порридж В Ко-ливинге
2) Какого-то хрена, O(N^2) insertion sort быстрее остальных крутыъ сортировок…
Порридж В Ко-ливинге
Квантовая оптимизация?!
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Черная магия, не иначе (jssort - стандартная сортировка)
Порридж В Ко-ливинге
Понятно, я звоню в Полицию
Yarik
Порридж В Ко-ливинге
а что это за сортировка?
Это я думал, что вместо того, чтобы свапать каждый раз, выгоднее найти индекс и просто слайсами все вырежать
Порридж В Ко-ливинге
Yarik
необычно)
Порридж В Ко-ливинге
Yarik
Порридж В Ко-ливинге
Охереть,
JSPerrf использовал
benchmark js который использовал
lodash _.now() что является простой
Date.now()
Порридж В Ко-ливинге
Yarik
Yarik
+ жрет линейно память
Порридж В Ко-ливинге
Думал он догадается что я хочу сделать. А в итоге он догадался, что insertion sort со свапами это сортировка и оптимизировал её круче родной Array.prototype.sort
Yarik
ну insertionSort (если правильно реализован) быстрее работает на почти отсортированных данных, поэтому могло так произойти
Yarik
https://www.toptal.com/developers/sorting-algorithms
Yarik
тут можно это увидеть
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Который я запускал еще 5 раз?)
Тогда я пошел в казино))
Порридж В Ко-ливинге
Yarik
тут надо смотреть правильно ли реализованы другие сортировки
Порридж В Ко-ливинге
Это я к тому, что insertion sort я сравнивал со стандартной сортировкой
Порридж В Ко-ливинге
Вполне возможно, что у меня что-то с тестами
Yarik
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Я забыл […testCase] сделать
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Я щас приторможу, и буду делать performance test. Вот читаю как лучше всего сделать
Yarik
ну в этих тестах нет большого смысла на самом деле
Yarik
они могут отличаться от операционки, проца, браузера (интерпретатора точнее) и тд
Yarik
причем сильно
Yarik
главное какое значение Big O ну и ему подобные
Порридж В Ко-ливинге
Ой как вы тут заблуждаетесь
Порридж В Ко-ливинге
Хотя конечно же, если вы разбираетесь и делали тесты, поправьтесь
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Yarik
Порридж В Ко-ливинге
А, ну с этого надо было начинать
aTan
Для начала сложности сортировок (критерий O(1) память, поэтому merge не подходит):
1) insertion sort: avg(N^2 / 4) worst(N^2 / 2)
2) quick sort: avg(N log N) worst(N^2)
3) heap sort: avg(2 * N logN) worst(2 * N logN)
ОЧЕНЬ ВАЖНЫ константы на которые мы делим
В общем стандартная сортировка в плюсах работает вроде так:
Смотрим подмассива:
if len < 8:
insertion sort
else if len > 1000:
heap sort
else:
quick sort
Если ну очень хочется заморочится, но мб было бы полезно в репозитории помимо кода, собрать в readme интересные и важные заметки о сортировках.
В читабельном формате (а не просто пару комментов к коду).
Пример (все еще не идеальный, так как собрана только самая базовая инфа):
https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/quick-sort
С описаниями вроде:
- почему одни сортировки полезнее других
- почему применяются O(Oˆ2) сортировки. Как в приведенном примере про различные константы. Мб с конкретными примерами, сравнения кол-ва элементарных операций при размере инпута.
Пример этого можно найти здесь:
Видео:
https://www.youtube.com/watch?v=FJJTYQYB1JQ&ab_channel=CppCon
Слайды (начиная с 13 страницы и это чуть к другому докладу):
https://github.com/aTan-aka-Xellos/algorithms-projector/blob/master/info/Allegro%20Means%20Both%20Fast%20and%20Happy%20-%20Andrei%20Alexandrescu%20(2).pdf
- почему QuickSort в худшем случае квадрат (постоянно забываю перепроверить и это редко кто объясняет)
- влияние кеширования и branch-prediction на сортировки
http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/
Ниже мб не самый удачный пример, так как для BS кол-во итераций маленькое и это не заметно, но тем ни менее:
https://leetcode.com/problems/binary-search/discuss/884875/java-simplestshortest-bs-without-confusing-indexes
Почти все BS используют 2 if внутри цикла, для сравнения с таргетом, хотя это можно вынести вне цикла. Почему то никто почти не использует этот паттерн.
При том, что здесь еще и не нужно заморачиватся с запоминанием куда добавлять 1.
- какие сортировки стабильные и в чем польза
aTan
Отдельный интересный момент про сортировку в С++ либе (если что, на С++ не пишу и в либах не шарю)
https://youtu.be/FJJTYQYB1JQ?t=3441
На несколько минут раньше, хорошее описание набора нерандомных тестовых данных.
Null
Happy Monday! 👋
https://vitkarpov.me/posts/html-entity-parser/
Порридж В Ко-ливинге
Если ну очень хочется заморочится, но мб было бы полезно в репозитории помимо кода, собрать в readme интересные и важные заметки о сортировках.
В читабельном формате (а не просто пару комментов к коду).
Пример (все еще не идеальный, так как собрана только самая базовая инфа):
https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/quick-sort
С описаниями вроде:
- почему одни сортировки полезнее других
- почему применяются O(Oˆ2) сортировки. Как в приведенном примере про различные константы. Мб с конкретными примерами, сравнения кол-ва элементарных операций при размере инпута.
Пример этого можно найти здесь:
Видео:
https://www.youtube.com/watch?v=FJJTYQYB1JQ&ab_channel=CppCon
Слайды (начиная с 13 страницы и это чуть к другому докладу):
https://github.com/aTan-aka-Xellos/algorithms-projector/blob/master/info/Allegro%20Means%20Both%20Fast%20and%20Happy%20-%20Andrei%20Alexandrescu%20(2).pdf
- почему QuickSort в худшем случае квадрат (постоянно забываю перепроверить и это редко кто объясняет)
- влияние кеширования и branch-prediction на сортировки
http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/
Ниже мб не самый удачный пример, так как для BS кол-во итераций маленькое и это не заметно, но тем ни менее:
https://leetcode.com/problems/binary-search/discuss/884875/java-simplestshortest-bs-without-confusing-indexes
Почти все BS используют 2 if внутри цикла, для сравнения с таргетом, хотя это можно вынести вне цикла. Почему то никто почти не использует этот паттерн.
При том, что здесь еще и не нужно заморачиватся с запоминанием куда добавлять 1.
- какие сортировки стабильные и в чем польза
Да, буду писать про это, главное слишком не заморочиться, т.к. это все таки JS
Порридж В Ко-ливинге
@vitkarpov Заэпрувьте мне merge sortы, чтобы я тестировать производительность начала 😃
Viktor
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Сегодня буду над тестами работать, должно получиться интересно
Viktor
@sergey_puzankov Сергей, привет! Рад видеть самого настоящего техноблогера и руководителя frontend science! Как поживает проект?
Sergey
Привет! Рад присоединиться! :) Проект продвигается медленно но уверенно- пока только на youtube. Неделю назад отметил 5000 подписчиков.
Sergey
А я вот сидел читал как раз твой блог - статью про HTTPS. Понял, что много не знал как это все работает за кулисами.
Viktor
Viktor
Я подправил, конечно.
Viktor
Sergey
Прямо офлайн курсы были но в далеких 2016-2017
Viktor
Ясно. В онлайне выгоднее выходит?
Sergey
потом были только онлайн курсы. Который я надеюсь возобновить после НГ.
Sergey
Причем это было (онлайн курсы) уже года 3 назад как. А сейчас после 8 месяцев постоянно работы из дома (и экономии 2х часов в день на транспорт) я вообще не уверен что захочу проводить офлайн :) Так привык, что "добраться до работы" занимает 10 секунд - пройти в соседнюю комнату.