2011-gre-cs-practice-book.pdf/Q03 — различия между версиями
StasFomin (обсуждение | вклад) |
|||
(не показаны 33 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
== Вопрос: Q03-08c765 == | == Вопрос: Q03-08c765 == | ||
− | + | Предположим, что любое ''n''-битное положительное целое число ''x'' хранится в виде связного списка битов так, что первый элемент списка является наименее значимым битом. Например, ''x'' = 14 = 1110<sub>2</sub> хранится как связный список (0,1,1,1) размера ''n'' = 4. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | < | + | Для этой структуры данных операция, которая заменяет ''x'' на <m>\left\lfloor\frac{x}{8}\right\rfloor</m> (целочисленное деление ''x'' на 8 с округлением вниз), может быть выполнена за: |
− | + | ||
− | + | ||
− | + | ||
− | + | === Ответы === | |
− | + | ||
− | + | * Правильный ответ: <m>\Theta(1)</m> | |
+ | * <m>\Theta(\log n)</m> | ||
+ | * <m>\Theta(n)</m> | ||
+ | * <m>\Theta(n \log n)</m> | ||
+ | * <m>\Theta(n^2)</m> | ||
− | === | + | === Объяснение === |
− | + | {{cstest-source|2011-gre-cs-practice-book.pdf|15|3}} | |
− | + | ||
− | + | Верный ответ <m>\Theta(1)</m> (константное время). | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Почему это верно: | |
− | + | * 1. Деление на 8 (в двоичной системе) эквивалентно сдвигу вправо на 3 позиции | |
− | + | * 2. Так как список начинается с наименее значимого бита, нам достаточно просто удалить первые 3 элемента списка | |
+ | * 3. В связном списке удаление первых элементов делается за константное время — достаточно переместить указатель начала списка | ||
+ | * 4. Независимо от размера входных данных ''n'', операция всегда требует одинакового (константного) количества действий | ||
− | + | Почему остальные варианты неверны: | |
− | + | * <m>\Theta(\log n)</m> — излишне много шагов, нет необходимости в логарифмической сложности для простой операции сдвига | |
− | < | + | |
− | + | * <m>\Theta(n)</m> — линейное время не требуется, так как нам не нужно проходить весь список | |
+ | |||
+ | * <m>\Theta(n \log n)</m> — слишком большая сложность для простой операции деления на 8 | ||
+ | |||
+ | * <m>\Theta(n^2)</m> — квадратичная сложность абсолютно избыточна для данной операции | ||
− | + | Ключевой момент в том, что из-за способа хранения числа (''LSB first'' — наименее значимый бит первый) и того, что деление на 8 это просто сдвиг на 3 бита, операция сводится к простому перемещению указателя в связном списке, что делается за константное время. | |
− | + | {{question-ok|[[Участник:StasFomin|StasFomin]] 20:16, 18 декабря 2024 (UTC)}} | |
− | + | ||
− | + | ||
− | + | [[Категория:Структуры данных]] | |
− | + | [[Категория:Биты]] |
Текущая версия на 20:24, 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 бита, операция сводится к простому перемещению указателя в связном списке, что делается за константное время.