Comments 10
В итоге, у меня на машине, 60% времени уходит на вызов std::sort().
Максимальная стоимость постройки дороги — 103. Сортировать дороги надо по стоимости. Очевидный намёк на bucket sort. По-моему, дальше смотреть надо в эту сторону, так как это позволяет получить отсортированный массив рёбер за O(n) вместо O(n log n).
Я попробовал так сделать, но тогда read_unlocked() читает мусор в m, а если использовать обычные потоки, то, похоже, 98% времени уходит на собственно чтение.
Максимальная стоимость постройки дороги — 103. Сортировать дороги надо по стоимости. Очевидный намёк на bucket sort. По-моему, дальше смотреть надо в эту сторону, так как это позволяет получить отсортированный массив рёбер за O(n) вместо O(n log n).
Я попробовал так сделать, но тогда read_unlocked() читает мусор в m, а если использовать обычные потоки, то, похоже, 98% времени уходит на собственно чтение.
0
Вики говорит, что bucket sort деградирует при большом количестве малоотличимых элементов, а они будут при достаточно большом входе, мб на малых входных данных выйгрыш и будет, но не на больших.
По поводу мусора в m, это да, мой косяк, забыл обнулить переменные, сейчас исправлю
По поводу мусора в m, это да, мой косяк, забыл обнулить переменные, сейчас исправлю
0
Спецификатор register уже давно как deprecated. И в целом в рассматриваемом примере нет ничего, что касалось бы оптимизации. Выравнивание может незначительно повлиять на std::sort, а для рассматриваемого алгоритма оно не имеет значения. Список инициализации в принципе не является оптимизацией (наоборот, не использование списков инициализации можно считать дурным тоном), к тому же никаким образом не влияет на рассматриваемый алгоритм.
+9
мб тут не так заметно, но оптимизация есть например в отличии от этого за счет выделения куска памяти без использования new/delete, тем самым оптимизируется работа с кешем. Перемещаться по элементам расположенным подряд эффективнее, чем перемещение по всей памяти, которые могут быть разбросаны изза new/delete
0
Не совсем верная эвристика сжатия путей. На корень будет указывать только элемент, для которого был вызван find, а должны указывать все элементы в пути до корня.
0
зачем? это одна из реализаций неперечислимых множеств, где нужно знать всего 1 факт об элементе: принадлежит этот элемент множеству (если да, то какому) или нет
0
Про списки инициализации в данном случае пример не очень удачный, потому что если size — это int, а parent — указатель, то ничего по умолчанию инициализироваться не будет. В итоге вариант со списком инициализации и инициализация присваиванием будут делать одно и то же. Скорее всего одинаково по скорости, хотя всякое может быть.
Для сложных типов здесь разница может быть, но тогда должен возникать другой вопрос, а не надо ли упростить сам класс, если он так часто создаётся.
Для сложных типов здесь разница может быть, но тогда должен возникать другой вопрос, а не надо ли упростить сам класс, если он так часто создаётся.
+1
Sign up to leave a comment.
Articles
Change theme settings
Оптимизация кода на C++ (C++11) на примере конкретной задачи