Ответы пользователя по тегу Информатика
  • Где используется бинарный поиск?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Да много где.

    Вот, в хроме, например.

    Из примеров там видно - поиск в списке заблокированных usb устройств, поиск графем в выводимом тексте, что-то с сертификатами, с метриками, при выборе какие видео фреймы рисовать...

    Бинарный поиск - слишком фундаментальный алгоритм и применяется везде, где надо на остортированном массиве данных что-то найти. В любом не тривиальном проекте, где кроме формочек и кнопочек есть хоть какие-то данные, эта ситуация может встретится и не раз.
    Ответ написан
    Комментировать
  • Какой получится результат псевдокода на языке Си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Переведите это, допустим, на C++ и скормите любому онлайн компилятору, если у вас на компе ничего не установлено.
    Ответ написан
    Комментировать
  • Если бы в компьютере было 3 уровня напряжения, то формула информации имела место быть?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Тут все завязано на то, что бит - это 2 состояния. Поэтому и логарифм двоичный. Если бы бит имел 3 состояния, то он не был бы 2 двоичных бита - нельзя так округлять (давайте вы свою квартплату так же до 100000 округлите, вам нормально?). Логарифмы были бы по основанию 3, ведь каждый новый трибит умножал бы количество возможных состояний на 3.
    Ответ написан
    6 комментариев
  • В чём разница между алгоритмами операций в дополнительных и обратных кодах?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Обратный код: !x = 2^n-1 - x.
    Дополнительный код - !x+1 = 2^n - x.

    В дополнительном коде число -x записывается как 2^n-x. Поэтому его можно просто прибавлять/вычитать/умножать - лишнее 2^n не влезает в разрядность переменной и просто будет проигнорированно.

    В обратном коде у вас есть лишнее -1, которое надо компенсировать. прибавлять при вычитании, вычитать при сложении и прибавлять множитель при умножении.

    Еще, в обратном коде никак не записать 2^(n-1), потому что число 0 представимо 2 раза в виде 00000000 и 100000000.
    Ответ написан
    Комментировать
  • Почему числа зависят от порядка байтов, а символы нет?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вы сами ответили на свой вопрос - "Обычные однобайтовые символы". Какая разница, в каком порядке этот один байт записывать?
    Ответ написан
    Комментировать
  • Операции AND, OR, XOR Как проверить биты?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    X AND (2^1+2^2) ИЛИ X AND 230


    Слева же правильно написано, но вы как-то из 2+4 получили 230.

    Х AND (255–2^2–2^7) ИЛИ Х AND 221

    Тоже самое. Правильную операцию сделали, но както из 255-4-128 получили 221, хотя должно быть 123.
    И вместо X пишите A или B в заданиях. Дальше такие же ошибки.
    Ответ написан
  • Вычитание в прямом коде?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Лучше вычитать в обратном коде, через сложение. Или вычитать меньшее из большего.

    Но если вам так хочется, то можно вычитать, пока не кончатся разряды.

    00000100
    -
    00000111
    =
    *1111101

    Но вот проблема, в последнем разряде (где у меня стоит *) на самом деле должна быть -1. просто больше не откуда заимствовать.

    Если же мы сделаем это заимствование, то получим X=11111101 и -1 в следующем, не существующем разряде.

    Это фактически и есть уже число в обратном коде! Если взять битовое НЕ и прибавить 1, то мы получим 0011 = 3, как и должны были. Ведь само число - -3.

    Но почему так получается? Ваше число на самом деле X - 2^8 (потому что 1 стоит в следующем, не существующем разряде).
    Или - (2^8-X). Побитовое НЕ. это просто вычитание из 111...111. Т.е. ~X=(2^8-1) -X.

    Остюда 2^8-X = ~X+1.

    Т.е. ваше число на самом деле ~X+1 по модулю.
    Ответ написан
    Комментировать
  • Какова сложность алгоритмов (Big(O)) встроенных JS методов?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Похоже документация не указывает сложность методов. Видимо, никто не ожидает от js кода производительности =)

    Тут ситуация еще осложняется тем, что стандарт не содержит требований по сложности. Поэтому одни и те же функции в разных браузерах, теоретически, могут иметь разную сложность.

    Возможно, можно нагуглить что-то по конкретным методам.

    По описанию метода concat, он возвращает новую строку не меняя аргументы. Поэтому, скорее всего, он работает за линейную сложность от общей длины операндов. Вряд ли там используется rope.
    Ответ написан
    2 комментария
  • Как решить эту задачу динамическое программирование?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Это стандартное упражнение на ДП.

    F(i,j) - максимальное количество монет, которые можно собрать придя в точку (i, j).

    F(0,0) = Z[0,0]
    F(i,j) = Z[i,j] + max(F(i-1,j), F(i,j-1))
    F(-1,*) = F(*,-1) = -100500
    ответ - F(n,m)

    Для восстановления пути сохраняйте в каждой ячейке, с какой стороны взят максимум - сверху или слева. И разворачивайте ответ с конца по этим ссылкам.
    Ответ написан
    1 комментарий