Прекрасный видеоряд с высоким качеством. Выражаю благодарность!
@MekkiMesser
3 жыл бұрын
Тут был я первокурсник желаю всего хорошего
@user-ui2bs1yg6d
4 жыл бұрын
Объяснили просто и доходчиво. Главное - понятно объяснили идею этого метода. Но сразу видно, что Вы - математик: 1. Начали объяснять двоичное разложение числа. Но в компьютере числа уже представлены в двоичном виде. Мы ведь не задумываемся, видя число в десятичном представлении, что каждая цифра умножается на степень 10. Я не говорю, что это неправильно, просто отвлекает внимание от основной идеи; 2. Выражение if(n%2 == 1) правильное, но не самое эффективное. Конечно, программист вместо вычисления остатка от деления, наложит маску if(n & 1). Но, даже, если использовать вычисление остатка от деления, то лучше записать if(n%2 != 0). Дело в том, что компьютер при выполнении каждой арифметической операции производит сравнение результата с 0 (как бесплатный "бонус"). А вот сравнение с 1 - это дополнительная операция. 3. Вместо деления n = n/2 можно применить операцию сдвига n >>= 1
@user-ui2bs1yg6d
3 жыл бұрын
@@shrgful Да, всё будет работать, но есть один неприятный "побочный эффект" и несколько других соображений по оптимизации: 1. Вы применили передачу параметров "по ссылке". Для первого параметра всё нормально (тем более, что Вы предусмотрительно объявили его const), хотя простые типы (а int - один из них) проще передавать "по значению", но для сложных типов (комплексные числа, матрицы) передача "по ссылке" - самое то! А вот со вторым параметром "int &n" - всё намного хуже! Передавая его "по ссылке" мы изменяем (фактически обнуляем) переменную вызывающей функции! Вот такой вот неприятный "побочный эффект" (!), которого быть не должно. Показатель степени надо передавать "по значению". 2. Вы не учли рекомендацию относительно предпочтительного сравнения с 0. Это не ошибка, а небольшая оптимизация, выполнить которую не так уж сложно. 3. Наша функция не умеет возводить в отрицательную степень. Подчеркнём это, объявив показатель степени беззнаковым (unsigned int). 4. Поскольку возводить в степень можно не только целые числа, имеет смысл объявить нашу функцию, как шаблон. Обращаю внимание, что в этом случае функция будет в единственном экземпляре только в исходном коде. Компилятор автоматически создаст реализации этой функции для всех типов, для которых мы вызовем эту функции в своей программе. template T pow(const T &a, unsigned int n){ T res = 1; T mult = a; while (n != 0) { if((n & 0x1) != 0) res *= mult; mult *= mult; n >>= 1; } return res; }
@kernelbug2294
3 жыл бұрын
Я ожидал увидеть подобный комментарий в 2000 году, но не в 2019, когда компиляторы научились оптимизировать код лучше человека, а люди пишут код не для машин, а для людей. Выражаю солидарность автору видео.
@user-ui2bs1yg6d
3 жыл бұрын
@@kernelbug2294 Я бы сказал, что программисты "обленились". Увы, но по опыту знаю, что заявление программистов, что они "пишут код не для машин, а для людей" чаще всего является оправданием для написания небрежного кода. Приходилось мне править такой вот "написанный для людей" код, в котором уже не могли разобраться ни компилятор, ни человек, ни даже сам его автор через пару месяцев. Видал и, когда отправляли на поставку код, откомпилированный в "Debug" (потому, что после компиляции в "Release" - зависал) - вот Вам и "оптимизация"! Красивый код - он хорошо понятен и машине и человеку! И никакой оптимизирующий компилятор не сможет исправить использование программистом не оптимального алгоритма! Хотя, согласен, что заменить деление на 2 сдвигом он сумеет. Но ведь ролик посвящён не проблемам Искусственного интеллекта, или Многокритериальной оптимизации. Решается довольно низкоуровневая задача. Вот на этом примере и стоит поучиться понять , как работает компьютер. Увы, но многие программисты, пишущие на языках высокого уровня, не совсем понимают, что собственно они пишут. И, столкнувшись с неправильной работой программы, пытаются решить проблему путём "подбора" вместо анализа написанного кода.
@user-ib3ev5pl2t
3 ай бұрын
а вот я новичок в этой сфере, не до конца понимаю системы счисления, а его объяснение про это мне помогло!!! так что излишнее объяснение не плохо, плохо мало объяснять)
@jaysoul802
2 жыл бұрын
Спасибо! 7класс а в учебнике уже десятые степени
@bunchathumbs6194
2 жыл бұрын
подскажите почему мы используем используем условие n%2==1, разве не может быть отличного от единицы остатка от деления? (заранее извиняюсь за глупый вопрос если что)
@sashulya-su
2 жыл бұрын
Ещё может быть остаток 0.
@q1ncite
Ай бұрын
при делении на 2 бывают остатки, 0;1
@user-ml4xx7ii8x
10 ай бұрын
n операций умножения или n-1, или это не принципиально? при обычном возведении имею в виду
@sashulya-su
9 ай бұрын
Не принципиально, так как порядок операций одинаковый
@AHTuBuPyC
5 жыл бұрын
А что не так с рекурсивным вариантом? Он же вообще тривиальный и запоминать не надо совсем.
@sashulya-su
5 жыл бұрын
Очень хороший вопрос! Не очень ясно о какой реализации идет речь, но подозреваю в основе будет лежать та же идея. И, опять же, как и в случае бин-поиска, к вопросу об асимптотике работы алгоритма по времени и по памяти. Рекурсия добавляет несколько вопросов: 1. асимптотика по памяти - если не используется хвостовая рекурсия, то будет O(log n) 2. если это O(log n), то можно ли добиться O(1) по памяти? Не представляю как написать с хвостовой рекурсией, а значит, скорее всего, при рекурсивном вызове будет съедаться стек. А ежели `a` - это матрица (а не число) то стек может и переполниться.
@user-ib3ev5pl2t
3 ай бұрын
@@sashulya-su def pow(x,n): if n==0: return 1 if n%2==0: return pow(x*x, n//2) return x*pow(x*x, (n-1)//2)
Пікірлер: 18