2011-gre-cs-practice-book.pdf/Q03 — различия между версиями

Материал из DISCOPAL
Перейти к: навигация, поиск
Строка 18: Строка 18:
 
Верный ответ <m>\Theta(1)</m> (константное время).
 
Верный ответ <m>\Theta(1)</m> (константное время).
  
Результат выполнения функции f():
+
Почему это верно:
 +
* 1. Деление на 8 (в двоичной системе) эквивалентно сдвигу вправо на 3 позиции
 +
* 2. Так как список начинается с наименее значимого бита, нам достаточно просто удалить первые 3 элемента списка
 +
* 3. В связном списке удаление первых элементов делается за константное время - достаточно переместить указатель начала списка
 +
* 4. Независимо от размера входных данных ''n'', операция всегда требует одинакового (константного) количества действий
  
Начальное состояние:
+
Почему остальные варианты неверны:
result = 0
+
k = 0
+
  
* Шаг 1: k = 0 -> k % 3 = 0 -> 0 != 1 -> result = 0 + 1 = 1
+
* <m>\Theta(log n)</m> - излишне много шагов, нет необходимости в логарифмической сложности для простой операции сдвига
  
* Шаг 2: k = 1 -> k % 3 = 1 -> 1 == 1 -> result = 1 + 1 = 2
+
* <m>\Theta(n)</m> - линейное время не требуется, так как нам не нужно проходить весь список
  
* Шаг 3: k = 2 -> k % 3 = 2 -> 2 != 1 -> result = 2 + 1 = 3
+
* <m>\Theta(n log n)</m> - слишком большая сложность для простой операции деления на 8
  
* Шаг 4: k = 3 -> k % 3 = 0 -> 0 != 1 -> result = 3 + 1 = 4
+
* <m>\Theta(n^2)</m> - квадратичная сложность абсолютно избыточна для данной операции
  
* Шаг 5: k = 4 -> k % 3 = 1 -> 1 == 1 -> result = 4 + 4 = 8
+
Ключевой момент в том, что из-за способа хранения числа (''LSB first'' - наименее значимый бит первый) и того, что деление на 8 это просто сдвиг на 3 бита, операция сводится к простому перемещению указателя в связном списке, что делается за константное время.
 
+
Функция завершается, возвращая значение result = 8
+
 
+
Самопроверка:
+
- цикл выполнился 5 раз (k от 0 до 4)
+
- условие k % 3 == 1 выполнилось дважды: при k = 1 и k = 4
+
- в остальных случаях добавлялась единица
+
  
 
{{reserve-task|[[Участник:Markvernikov|Markvernikov]] 10:19, 18 декабря 2024 (UTC)}}
 
{{reserve-task|[[Участник:Markvernikov|Markvernikov]] 10:19, 18 декабря 2024 (UTC)}}
 
{{checkme|[[Участник:Markvernikov|Markvernikov]] 11:07, 18 декабря 2024 (UTC)}}
 
{{checkme|[[Участник:Markvernikov|Markvernikov]] 11:07, 18 декабря 2024 (UTC)}}

Версия 11:23, 18 декабря 2024

Вопрос: Q03-08c765

Предположим, что любое n-битное положительное целое число x хранится в виде связного списка битов так, что первый элемент списка является наименее значимым битом. Например, x = 14 = 11102 хранится как связный список (0,1,1,1) размера n = 4.

Для этой структуры данных операция, которая заменяет x на (целочисленное деление x на 8 с округлением вниз), может быть выполнена за:

Ответы

  • Правильный ответ:

Объяснение

Исходники — вопрос 3 на 15 странице книги «2011-gre-cs-practice-book.pdf»

Верный ответ (константное время).

Почему это верно:

  • 1. Деление на 8 (в двоичной системе) эквивалентно сдвигу вправо на 3 позиции
  • 2. Так как список начинается с наименее значимого бита, нам достаточно просто удалить первые 3 элемента списка
  • 3. В связном списке удаление первых элементов делается за константное время - достаточно переместить указатель начала списка
  • 4. Независимо от размера входных данных n, операция всегда требует одинакового (константного) количества действий

Почему остальные варианты неверны:

  • - излишне много шагов, нет необходимости в логарифмической сложности для простой операции сдвига
  • - линейное время не требуется, так как нам не нужно проходить весь список
  • - слишком большая сложность для простой операции деления на 8
  • - квадратичная сложность абсолютно избыточна для данной операции

Ключевой момент в том, что из-за способа хранения числа (LSB first - наименее значимый бит первый) и того, что деление на 8 это просто сдвиг на 3 бита, операция сводится к простому перемещению указателя в связном списке, что делается за константное время.

Задача зарезервирована: Markvernikov 10:19, 18 декабря 2024 (UTC)

Check-me-animated.gif Решено: Markvernikov 11:07, 18 декабря 2024 (UTC)