Viktor
Ну, тут не памятью жертвуем, хотя она может дойти до O(log N)
это я про heap sort vs merge sort, и вообще в принципе
Порридж В Ко-ливинге
это я про heap sort vs merge sort, и вообще в принципе
Ааа, ну да. merge sort вообще в серьез нигде не рассматривают
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
необычно)
Порридж В Ко-ливинге
необычно)
Что необычно?
Порридж В Ко-ливинге
Охереть, JSPerrf использовал benchmark js который использовал lodash _.now() что является простой Date.now()
Порридж В Ко-ливинге
Охереть, JSPerrf использовал benchmark js который использовал lodash _.now() что является простой Date.now()
Т.е. весь интернет, просто использовал Date.now() чтобы проверять эфективность кода. ЧТО!?
Порридж В Ко-ливинге
это, не помню просто такого в реализации insertion sort
Ну да, я думал не свапать каждый раз, а один раз сделать новый массив слайсами. По сути одно и тоже
Yarik
+ жрет линейно память
Порридж В Ко-ливинге
при свапе не создается новые массивы, а при слайсах - да
Так я рассчитывал на оптимизацию. Ясен хрен новые массивы будут
Порридж В Ко-ливинге
Думал он догадается что я хочу сделать. А в итоге он догадался, что insertion sort со свапами это сортировка и оптимизировал её круче родной Array.prototype.sort
Yarik
ну insertionSort (если правильно реализован) быстрее работает на почти отсортированных данных, поэтому могло так произойти
Yarik
https://www.toptal.com/developers/sorting-algorithms
Yarik
тут можно это увидеть
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Который я запускал еще 5 раз?) Тогда я пошел в казино))
Порридж В Ко-ливинге
Yarik
тут надо смотреть правильно ли реализованы другие сортировки
Порридж В Ко-ливинге
тут надо смотреть правильно ли реализованы другие сортировки
Можешь ему писать претензии к Array.prototype.sort https://twitter.com/ryanmdahl 🤣
Порридж В Ко-ливинге
тут надо смотреть правильно ли реализованы другие сортировки
Не думаю что разрабы гугла неправильно сделали сортровку на самом популярном движке js))))
Порридж В Ко-ливинге
Это я к тому, что insertion sort я сравнивал со стандартной сортировкой
Порридж В Ко-ливинге
Вполне возможно, что у меня что-то с тестами
Yarik
Можешь ему писать претензии к Array.prototype.sort https://twitter.com/ryanmdahl 🤣
ну я хз как при рандомных значениях O(n log n) может быть медленнее O(n2)
Порридж В Ко-ливинге
Я забыл […testCase] сделать
Порридж В Ко-ливинге
Теперь все в порядке
Порридж В Ко-ливинге
ну я хз как при рандомных значениях O(n log n) может быть медленнее O(n2)
Не, просто я туплю. Было бы не плохо, если бы вы сделали код ревью.
Порридж В Ко-ливинге
Я щас приторможу, и буду делать performance test. Вот читаю как лучше всего сделать
Yarik
ну в этих тестах нет большого смысла на самом деле
Yarik
они могут отличаться от операционки, проца, браузера (интерпретатора точнее) и тд
Yarik
причем сильно
Yarik
главное какое значение Big O ну и ему подобные
Порридж В Ко-ливинге
Ой как вы тут заблуждаетесь
Порридж В Ко-ливинге
они могут отличаться от операционки, проца, браузера (интерпретатора точнее) и тд
1) Я на ноде тестирую, так что интерпретатор 1. Насчет браузеров да. 2) От проца JS отличаться не будет, т.к. интепретатор один на все процы, это не плюсы где можно по разному скомпилить. 3) Операционки да, но их всего 3, и думаю отличия будут там не значительные
Порридж В Ко-ливинге
Хотя конечно же, если вы разбираетесь и делали тесты, поправьтесь
Порридж В Ко-ливинге
главное какое значение Big O ну и ему подобные
Больше влияет оптимизация в JS, т.к. O у всех почти одинаковая
Yarik
Больше влияет оптимизация в JS, т.к. O у всех почти одинаковая
фишка в том, что на одной версии V8 (в ноде который) может быть быстрее одно, а на другой версии - другое) Там столько задротства в этом движке, что жесть
Порридж В Ко-ливинге
фишка в том, что на одной версии V8 (в ноде который) может быть быстрее одно, а на другой версии - другое) Там столько задротства в этом движке, что жесть
Там не так уж и много “задротсва”. Очень редко добавляют какую-то новую оптимизацию. Вроде всего 2 раза глобально что-то добавляли. Странные выводы у вас
Yarik
Почему же, кроме мажорных версий по типу 8 и 12?)))
врятли какие-то оптимизации кода входят в мажорные версии, код же работает так как и работал. Просто может быть чуть быстрее или стать медленнее в каких-то местах или кейсах
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
@sergey_puzankov Сергей, привет! Рад видеть самого настоящего техноблогера и руководителя frontend science! Как поживает проект?
Sergey
Привет! Рад присоединиться! :) Проект продвигается медленно но уверенно- пока только на youtube. Неделю назад отметил 5000 подписчиков.
Sergey
А я вот сидел читал как раз твой блог - статью про HTTPS. Понял, что много не знал как это все работает за кулисами.
Viktor
А я вот сидел читал как раз твой блог - статью про HTTPS. Понял, что много не знал как это все работает за кулисами.
Я тоже, пока не решил подготовить статью. Мне потом прилетел фидбек, что некоторые вещи я путаю, и это классно: сила комьюнити.
Viktor
Я подправил, конечно.
Sergey
Прямо офлайн курсы были но в далеких 2016-2017
Viktor
Ясно. В онлайне выгоднее выходит?
Sergey
потом были только онлайн курсы. Который я надеюсь возобновить после НГ.
Sergey
Ясно. В онлайне выгоднее выходит?
Ну по ощущениям это 2 разных формата вообще. Но я выбрал онлайн так как он наименее затратен по времени на транспорт.
Sergey
Причем это было (онлайн курсы) уже года 3 назад как. А сейчас после 8 месяцев постоянно работы из дома (и экономии 2х часов в день на транспорт) я вообще не уверен что захочу проводить офлайн :) Так привык, что "добраться до работы" занимает 10 секунд - пройти в соседнюю комнату.