132 KiB
132 KiB
| 1 | level | domain | question | answer | ref |
|---|---|---|---|---|---|
| 2 | base | algo | Во что превращается 3n + 100 в O-нотации | O(n) | урок D1_algo |
| 3 | base | algo | Сколько шагов у бинарного поиска в массиве из 10⁶ элементов | 20 (log₂ 10⁶ ≈ 20) | урок D1_algo |
| 4 | core | algo | Почему push_back в среднем O(1), а не O(n) | ёмкость растёт геометрически (удвоение), сумма реаллокаций на n вставок — геометрическая прогрессия ≈ n, а не n² | урок D1_algo |
| 5 | core | algo | Что ломает удвоение ёмкости у vector | указатели/итераторы/ссылки на старые элементы (реаллокация переносит блок памяти) | урок D1_algo |
| 6 | deep | algo | Что будет, если ёмкость vector растить на +1 за раз вместо удвоения | суммарная стоимость n вставок станет O(n²) | урок D1_algo |
| 7 | base | algo | Сложность построения кучи (heapify) из произвольного массива | O(n), не O(n log n) | урок D1_algo |
| 8 | base | algo | Какая сортировка всегда O(n log n) и устойчива | mergesort | урок D1_algo |
| 9 | core | algo | Худший случай quicksort и когда он достигается | O(n²), на уже отсортированном массиве при плохом выборе опорного | урок D1_algo |
| 10 | core | algo | Нижняя граница сортировки сравнениями | Ω(n log n) | урок D1_algo |
| 11 | core | algo | За счёт чего map держит высоту log n | инвариант красно-чёрного дерева: чередование цветов + равное число чёрных узлов на пути от корня до листа | урок D1_algo |
| 12 | deep | algo | Почему нельзя полагаться на порядок обхода unordered_map | порядок бакетов не гарантирован и может меняться при rehash | урок D1_algo |
| 13 | base | algo | Формула фактора загрузки | load = size / capacity | урок D1_algo |
| 14 | base | algo | Порог load factor при открытой адресации, после которого делают rehash | обычно ≤ 0.7 | урок D1_algo |
| 15 | core | algo | Зачем tombstone при открытой адресации | чтобы удаление не обрывало цепочку зондирования: поиск должен пройти сквозь помеченную ячейку до элемента, вставленного позже | урок D1_algo |
| 16 | core | algo | Почему ёмкость хеш-таблицы берут степенью двойки | idx = hash & (cap-1) вместо деления по модулю — дешевле на процессоре | урок D1_algo |
| 17 | core | algo | Что физически происходит при rehash | выделяется массив вдвое больше, каждый элемент переставляется по новому индексу (зависит от cap) | урок D1_algo |
| 18 | deep | algo | Почему rehash даёт амортизированное O(1), а не O(n) на вставку | та же геометрическая прогрессия, что у vector::push_back: суммарная стоимость n вставок ≈ n, а не n² | урок D1_algo |
| 19 | base | algo | Сложность has_pair (вложенный цикл по всем парам) | O(n²) | урок D1_algo |
| 20 | core | algo | Сложность has_pair_fast по времени и по памяти | O(n) по времени в среднем, O(n) дополнительной памяти под хеш-множество | урок D1_algo |
| 21 | base | algo | Какие константы использует FNV-1a в этом коде (offset basis / prime) | 1469598103934665603 / 1099511628211 | урок D1_algo |
| 22 | core | algo | Почему rehash пересчитывает индекс для каждого узла, а не переносит их как есть | индекс = hash % buckets.size(), а size() изменился (удвоился), старые индексы для нового размера в общем случае неверны | урок D1_algo |
| 23 | core | algo | Чем открытая адресация выигрывает у цепочек по производительности и почему | она кэш-дружелюбнее: элементы лежат подряд в массиве, а не разбросаны по куче отдельными узлами | урок D1_algo |
| 24 | deep | algo | Может ли load factor у цепочек быть больше 1 | да, цепочка просто станет длиннее (в отличие от открытой адресации, где load ≤ 1 всегда) | урок D1_algo |
| 25 | base | linux | Что возвращает `fork()` в родителе и в ребёнке | в родителе PID ребёнка (>0), в ребёнке 0, при ошибке −1 | урок D1_linux |
| 26 | core | linux | Что происходит со страницами памяти при `fork()` | ничего сразу: COW, физическая копия страницы создаётся при первой записи в неё (page fault) | урок D1_linux |
| 27 | core | linux | Почему `fork` дешёвый даже для процесса с гигабайтами памяти | копируются не данные, а только записи таблицы страниц; сами страницы данных не дублируются, пока их не изменят | урок D1_linux |
| 28 | base | linux | Что нужно сделать с `stdout` перед `fork`, если он не пуст | вызвать `fflush(stdout)`, иначе буфер продублируется в ребёнке | урок D1_linux |
| 29 | deep | linux | Какой размер страницы памяти на x86-64, о которой копия делается при COW | 4 КБ | урок D1_linux |
| 30 | base | linux | Чем `exec` отличается от `fork` | `fork` создаёт новый процесс, `exec` заменяет образ текущего процесса, не создавая нового | урок D1_linux |
| 31 | core | linux | Что сохраняется у процесса после успешного `exec` | PID и таблица открытых файловых дескрипторов, кроме помеченных `FD_CLOEXEC` | урок D1_linux |
| 32 | core | linux | Почему `exec` при успехе никогда не возвращает управление | старого кода, куда можно было бы вернуться, больше не существует — адресное пространство заменено новым образом | урок D1_linux |
| 33 | base | linux | Разница между `execlp`, `execv`, `execvp` | `execlp` ищет в `PATH`, `execv` — по полному пути, `execvp` — по имени в `PATH` | урок D1_linux |
| 34 | base | linux | Зачем нужен `waitpid` | забрать код возврата завершившегося ребёнка и позволить ядру освободить его запись в таблице процессов | урок D1_linux |
| 35 | core | linux | Что такое зомби и почему он не исчезает сам | процесс, завершивший `exit()`, чью запись ещё не забрал родитель через `wait`; ядру некуда передать код возврата, кроме как дождаться `wait` | урок D1_linux |
| 36 | core | linux | Чем зомби отличается от сироты | зомби: родитель жив, но не вызвал `wait`; сирота: родитель умер, процесс усыновлён init/systemd (PID 1) | урок D1_linux |
| 37 | base | linux | Откуда код возврата 137 и 139 | 137 = 128+9 (SIGKILL), 139 = 128+11 (SIGSEGV) — так оболочка кодирует завершение по сигналу | урок D1_linux |
| 38 | core | linux | Как правильно проверить, что ребёнок убит сигналом, а не завершился штатно | макросами `WIFSIGNALED(status)`/`WTERMSIG(status)`, не сравнением `status` напрямую | урок D1_linux |
| 39 | deep | linux | Что показывает `WCOREDUMP(status)` | что завершение по сигналу сопровождалось записью core-дампа на диск | урок D1_linux |
| 40 | base | linux | Номера сигналов SIGINT/SIGKILL/SIGTERM/SIGSEGV/SIGPIPE/SIGCHLD | 2/9/15/11/13/17 | урок D1_linux |
| 41 | core | linux | Чем SIGTERM отличается от SIGKILL | SIGTERM перехватывается и позволяет корректно завершиться, SIGKILL не перехватывается и не игнорируется, ядро снимает процесс с исполнения напрямую | урок D1_linux |
| 42 | core | linux | Что можно делать внутри обработчика сигнала | только менять `volatile sig_atomic_t`; `printf`/`malloc` небезопасны (не async-signal-safe) | урок D1_linux |
| 43 | base | linux | Чем `sigaction` лучше `signal` | поведение `signal` исторически различается между Unix-системами, `sigaction` даёт предсказуемую и переносимую семантику | урок D1_linux |
| 44 | deep | linux | Что происходит, если сервис игнорирует SIGTERM при `systemctl stop` | по истечении `TimeoutStopSec` (по умолчанию ~90 c) systemd посылает SIGKILL принудительно | урок D1_linux |
| 45 | base | linux | Что означает EINTR и как на него реагировать | вызов прерван доставкой сигнала; корректная реакция — повторить вызов | урок D1_linux |
| 46 | base | linux | Чем EAGAIN отличается от обычной ошибки чтения | данных сейчас нет на неблокирующем дескрипторе, это не сбой, а сигнал «попробуй позже» | урок D1_linux |
| 47 | core | linux | Когда безопасно читать `errno` | сразу после ошибки вызова, до любого другого вызова, способного его перезаписать | урок D1_linux |
| 48 | deep | linux | Какой errno сигнализирует об исчерпании лимита открытых дескрипторов процесса | EMFILE (лимит задаётся `ulimit -n`) | урок D1_linux |
| 49 | base | linux | Какой код возврата у шелла даст несуществующая команда | 127 | урок D1_linux |
| 50 | base | linux | Какие дескрипторы дочерний процесс получает от родителя при `fork` и почему вывод команды сразу виден в терминале | 0/1/2 (stdin/stdout/stderr) наследуются через копию таблицы дескрипторов при `fork` | урок D1_linux |
| 51 | core | linux | Каким флагом собрать бинарник для проверки на утечки и UB | `-fsanitize=address,undefined -fno-omit-frame-pointer` | урок D1_linux |
| 52 | base | algo | Из чего состоит узел бинарного дерева при представлении указателями | значение + два указателя (left, right) | урок D2_algo |
| 53 | core | algo | Размер `struct TreeNode { int val; TreeNode *left, *right; }` на x86-64 | 24 байта: 4 байта `val` + 4 байта паддинга (выравнивание указателя на 8) + 8 + 8 байт под указатели | урок D2_algo |
| 54 | core | algo | Когда массивное представление дерева компактно, а когда нет | компактно только для полного/близкого к полному дерева (куча); для разреженного дерева индексы `2i+1/2i+2` требуют до `2^h` ячеек, большинство из которых пустует | урок D2_algo |
| 55 | deep | algo | Почему куча хранится в массиве, а не через указатели | куча всегда почти полное дерево (заполнена по уровням слева направо без пропусков), индексная арифметика не тратит память впустую и не требует отдельной аллокации на узел | урок D2_algo |
| 56 | base | algo | Порядок посещения в inorder-обходе | left, node, right | урок D2_algo |
| 57 | base | algo | Какой обход даёт отсортированный порядок для BST | inorder | урок D2_algo |
| 58 | core | algo | Память DFS (рекурсия или явный стек) по глубине дерева | O(h) — пропорционально высоте | урок D2_algo |
| 59 | core | algo | Память BFS (очередь) | O(w) — пропорционально максимальной ширине уровня | урок D2_algo |
| 60 | core | algo | Для полного сбалансированного дерева из 10⁶ узлов: высота и ширина последнего уровня | h ≈ 20 (log₂10⁶≈20), ширина последнего уровня ≈ 500 000 — BFS может требовать памяти на порядки больше, чем DFS | урок D2_algo |
| 61 | deep | algo | Какой обход используют, чтобы освободить дерево снизу вверх | postorder (сначала оба ребёнка, потом сам узел) | урок D2_algo |
| 62 | base | algo | Инвариант BST | для каждого узла все значения в левом поддереве меньше значения узла, все значения в правом — больше | урок D2_algo |
| 63 | base | algo | Сложность поиска в BST | O(h), где h — высота дерева | урок D2_algo |
| 64 | core | algo | Что даёт inorder-обход BST | значения по возрастанию — прямое следствие инварианта | урок D2_algo |
| 65 | core | algo | Высота BST в лучшем и худшем случае для n узлов | сбалансированное: h ≈ log₂n; вырожденное: h = n | урок D2_algo |
| 66 | deep | algo | Что произойдёт при вставке 1,2,...,n по порядку в обычный (небалансирующийся) BST | дерево вырождается в цепочку (каждый новый узел — правый ребёнок предыдущего), поиск деградирует до O(n) | урок D2_algo |
| 67 | base | algo | Почему нельзя валидировать BST, сравнивая узел только с непосредственным родителем | нарушение инварианта может возникнуть через поколение (правый потомок левого поддерева больше корня, но меньше своего прямого родителя) — локальная проверка это не ловит | урок D2_algo |
| 68 | core | algo | Как правильно валидировать BST рекурсивно | передавать вниз границы (min, max): узел должен строго лежать между ними, для левого поддерева ужесточается верхняя граница, для правого — нижняя | урок D2_algo |
| 69 | core | algo | Сложность LCA в BST и почему | O(h): если оба искомых значения меньше текущего узла — влево, оба больше — вправо, иначе текущий узел и есть LCA | урок D2_algo |
| 70 | core | algo | Сложность LCA в обычном бинарном дереве без порядка | O(n): нет инварианта, отсекающего часть дерева, нужна рекурсия postorder по потенциально всем узлам | урок D2_algo |
| 71 | deep | algo | Альтернативный способ валидации BST без явных границ (min, max) | inorder-обход с проверкой строгого возрастания относительно предыдущего посещённого значения | урок D2_algo |
| 72 | base | algo | Индексы детей и родителя в куче на массиве для узла i | дети 2i+1, 2i+2; родитель (i-1)/2 (целочисленное деление) | урок D2_algo |
| 73 | base | algo | Сложность доступа к максимуму (top) в max-heap | O(1) — максимум всегда в корне по инварианту | урок D2_algo |
| 74 | core | algo | Сложность sift-up/sift-down | O(log n) — путь ограничен высотой дерева | урок D2_algo |
| 75 | core | algo | За какое время строится куча через bottom-up heapify против n последовательных push | O(n) против O(n log n): работа sift-down в узле пропорциональна его высоте h, а сумма Σ h/2^h по всем узлам сходится к константе | урок D2_algo |
| 76 | deep | algo | С какого индекса стартует bottom-up heapify и куда идёт | с последнего нелистового узла, индекс n/2 - 1, к корню (индекс 0) | урок D2_algo |
| 77 | base | algo | Что такое `std::priority_queue` по умолчанию | max-heap поверх vector; для min-heap передают компаратор std::greater<> | урок D2_algo |
| 78 | core | algo | Сложность top-K через полную кучу | O(n + k log n): O(n) heapify + k раз pop по O(log n) | урок D2_algo |
| 79 | core | algo | Когда используют min-heap размера k вместо полной кучи | на потоке данных, не помещающемся в память целиком: min-heap размера k хранит только k текущих кандидатов, O(n log k), память O(k) | урок D2_algo |
| 80 | core | algo | Средняя и худшая сложность `nth_element` (quickselect) | в среднем O(n), в худшем O(n²) — та же причина, что у quicksort: устойчиво плохой выбор опорного | урок D2_algo |
| 81 | deep | algo | Почему top-K через nth_element не даёт готовый отсортированный список | nth_element только частично упорядочивает вокруг k-го элемента без порядка внутри половин; нужна досортировка k-элементного префикса | урок D2_algo |
| 82 | deep | algo | Как получить top-K частых элементов за O(n) без log-фактора | подсчёт хеш-таблицей O(n), затем bucket sort по частоте: частота не превышает n, массив корзин размера n+1 индексируется частотой напрямую | урок D2_algo |
| 83 | base | c_cpp | sizeof(struct { char a; int b; char c; }) на x86-64 | 12 байт | урок D2_cpp |
| 84 | core | c_cpp | Смещения полей a, b, c в этой структуре | a=0, b=4 (после 3 байт паддинга), c=8 | урок D2_cpp |
| 85 | core | c_cpp | Почему в конце структуры ещё 3 байта паддинга | размер всей структуры округляется вверх до кратного выравниванию самого строгого поля (здесь int, выравнивание 4): 9 → 12 | урок D2_cpp |
| 86 | deep | c_cpp | Что делает #pragma pack(1) и какая у него цена | убирает паддинг (sizeof(S) станет 6), но доступ к невыровненным полям дороже на x86 и может аппаратно упасть на платформах со строгим выравниванием | урок D2_cpp |
| 87 | base | c_cpp | Какие 5 функций входят в правило пяти | деструктор, конструктор копирования, оператор присваивания копированием, конструктор перемещения, оператор присваивания перемещением | урок D2_cpp |
| 88 | base | c_cpp | Что делает сгенерированный компилятором конструктор копирования по умолчанию | побитовое (memberwise) копирование каждого поля | урок D2_cpp |
| 89 | core | c_cpp | Почему копирование объекта с владеющим сырым указателем даёт double-free | оба объекта получают одно и то же значение указателя (адрес), оба деструктора вызывают delete на этом адресе — второй раз на уже освобождённой памяти | урок D2_cpp |
| 90 | core | c_cpp | Что такое rule of zero | не объявлять ни одну из пяти спецфункций вручную, доверив владение ресурсом готовым RAII-обёрткам (unique_ptr, vector, string) — их сгенерированные копирование/перемещение уже корректны | урок D2_cpp |
| 91 | base | c_cpp | Что добавляет в объект наличие хотя бы одной virtual-функции | скрытый указатель на vtable, обычно 8 байт на 64-битной платформе | урок D2_cpp |
| 92 | core | c_cpp | Что произойдёт при delete через Base*, если ~Base() не virtual, а объект на деле Derived | вызовется только ~Base(), ~Derived() не вызовется вообще — утечка ресурсов Derived, формально UB | урок D2_cpp |
| 93 | core | c_cpp | Чем это ловится | LeakSanitizer, со стеком выделения внутри конструктора Derived | урок D2_cpp |
| 94 | deep | c_cpp | Что вызовет virtual-функция, вызванная из конструктора базового класса | версию базового класса, а не переопределённую в наследнике: vtable объекта на этом этапе ещё указывает на таблицу Base | урок D2_cpp |
| 95 | base | c_cpp | Что физически делает std::move во время выполнения программы | ничего: это static_cast к rvalue-ссылке (T&&), явный каст, не операция | урок D2_cpp |
| 96 | core | c_cpp | Что реально выполняет перемещение данных | move-конструктор/move-оператор присваивания конкретного типа, выбранный благодаря касту std::move | урок D2_cpp |
| 97 | core | c_cpp | Что происходит с vector при перемещении и за какое время | копируются 3 внутренних указателя (начало, конец данных, конец ёмкости) в новый объект, у источника они обнуляются — O(1), без копирования элементов | урок D2_cpp |
| 98 | deep | c_cpp | В каком состоянии находится объект после std::move(obj) по стандарту | в валидном, но неопределённом состоянии — использование старых данных не UB, но логическая ошибка, не ловится санитайзерами | урок D2_cpp |
| 99 | base | c_cpp | Что проверяет ASAN, а что | UBSAN? — ASAN: ошибки работы с памятью (границы, use-after-free, double-free, утечки); UBSAN: операции, являющиеся UB по стандарту (переполнение, сдвиг, выравнивание) | урок D2_cpp |
| 100 | base | c_cpp | Значение INT_MAX для 32-битного int | 2147483647 | урок D2_cpp |
| 101 | core | c_cpp | Почему UB опасен именно тем, что код может работать в отладочной сборке и падать в релизной | оптимизатор релизной сборки строит код в предположении, что UB не происходит, и может убрать проверки, которые, по мнению программиста, должны были сработать | урок D2_cpp |
| 102 | core | c_cpp | Какой флаг компилятора включает сразу оба санитайзера | -fsanitize=address,undefined | урок D2_cpp |
| 103 | deep | c_cpp | Почему разыменование nullptr на практике обычно даёт SIGSEGV, а не тихо читает мусор | ОС намеренно не отображает страницу по адресу 0 в физическую память, поэтому любое обращение к ней гарантированно и предсказуемо падает | урок D2_cpp |
| 104 | base | linux | Какие флаги комбинируются битовым ИЛИ при open() | O_RDONLY/O_WRONLY/O_RDWR, O_APPEND, O_CREAT, O_TRUNC, O_NONBLOCK | урок D2_linux |
| 105 | base | linux | Что возвращает read() при достижении конца файла | 0 | урок D2_linux |
| 106 | core | linux | Что делает lseek() и меняет ли он содержимое файла | двигает позицию чтения/записи файла, содержимое не трогает | урок D2_linux |
| 107 | core | linux | Чем O_APPEND отличается от ручного lseek(fd, 0, SEEK_END) перед каждой записью | O_APPEND атомарно смещает позицию в конец непосредственно перед самой записью на уровне ядра, ручной lseek+write у двух процессов может гонку: оба сделают lseek, потом оба write, и один перезапишет данные другого | урок D2_linux |
| 108 | base | linux | Может ли write() записать меньше байт, чем попросили, без ошибки | да, это не ошибка, нужен цикл дозаписи | урок D2_linux |
| 109 | core | linux | Чем fdatasync отличается от fsync | fsync сбрасывает на диск данные и все метаданные файла, fdatasync — только данные и те метаданные, что нужны для последующего чтения (например, размер), пропуская остальные (время доступа) | урок D2_linux |
| 110 | core | linux | Какой errno означает «вызов прерван сигналом, нужно просто повторить» | EINTR | урок D2_linux |
| 111 | base | linux | В чём разница MAP_SHARED и MAP_PRIVATE | MAP_SHARED: изменения видны другим процессам и попадают в файл; MAP_PRIVATE: copy-on-write, изменения приватны и не попадают в файл на диске | урок D2_linux |
| 112 | base | linux | Что делает msync | принудительно сбрасывает изменения MAP_SHARED-области на диск, не дожидаясь ядра | урок D2_linux |
| 113 | core | linux | Чем minor page fault отличается от major | minor: страница уже в страничном кэше, только добавляется отображение (дёшево); major: страница реально читается с диска (дорого) | урок D2_linux |
| 114 | core | linux | Когда mmap проигрывает read по скорости | при однократном последовательном чтении небольшого файла — накладные расходы на отображение и page fault не амортизируются | урок D2_linux |
| 115 | deep | linux | Что ограничивает mmap на 32-битных системах | размер доступного виртуального адресного пространства (порядка нескольких гигабайт) — файл целиком отобразить может не получиться | урок D2_linux |
| 116 | base | linux | Жёсткий лимит числа дескрипторов у select и его значение | FD_SETSIZE, 1024 | урок D2_linux |
| 117 | base | linux | Сложность select и poll на один вызов | O(n) от общего числа отслеживаемых дескрипторов, независимо от того, сколько готовы | урок D2_linux |
| 118 | core | linux | Три функции epoll и их роль | epoll_create1 (создать инстанс), epoll_ctl (ADD/MOD/DEL в списке интереса), epoll_wait (забрать готовые из списка готовых) | урок D2_linux |
| 119 | core | linux | На чём построен список интереса epoll внутри ядра | на красно-чёрном дереве | урок D2_linux |
| 120 | core | linux | Сложность epoll_wait на одно готовое событие | O(1) — ядро уже отфильтровало готовые дескрипторы заранее, работа не зависит от общего числа зарегистрированных | урок D2_linux |
| 121 | base | linux | В чём разница level-triggered и edge-triggered | LT: событие повторяется, пока условие истинно; ET: событие сообщается один раз, в момент перехода в готовое состояние | урок D2_linux |
| 122 | core | linux | Почему ET требует неблокирующих дескрипторов | на блокирующем дескрипторе цикл чтения до исчерпания данных на последнем вызове заблокируется навсегда вместо возврата EAGAIN | урок D2_linux |
| 123 | core | linux | Что произойдёт, если в ET-режиме не дочитать данные до EAGAIN | оставшиеся данные не будут сигнализированы повторно, пока состояние дескриптора не изменится снова (например, не придут новые данные) | урок D2_linux |
| 124 | deep | linux | Какой флаг epoll_ctl включает edge-triggered режим | EPOLLET | урок D2_linux |
| 125 | base | linux | Что означает EAGAIN/EWOULDBLOCK на неблокирующем дескрипторе | данных для чтения нет (или буфер записи полон) прямо сейчас — не ошибка, повторить позже | урок D2_linux |
| 126 | core | linux | Совпадают ли числовые значения EAGAIN и EWOULDBLOCK на Linux | да, это синонимы с одним и тем же значением | урок D2_linux |
| 127 | base | linux | Сколько времени сокет проводит в TIME_WAIT | 2×MSL (удвоенное время жизни сегмента в сети) | урок D2_linux |
| 128 | core | linux | Зачем нужно состояние TIME_WAIT | чтобы поймать задержавшиеся в сети дубликаты сегментов старого соединения и не спутать их с новым, если порт переиспользуют слишком быстро | урок D2_linux |
| 129 | core | linux | Что даёт SO_REUSEADDR | разрешает bind на адрес/порт, у которого уже есть сокеты в состоянии TIME_WAIT — иначе bind вернёт «Address already in use» | урок D2_linux |
| 130 | base | algo | Сложность вставки в список, если указатель на место уже есть | O(1) | урок D3_algo |
| 131 | base | algo | Сложность поиска элемента в связном списке | O(n) | урок D3_algo |
| 132 | core | algo | Почему список медленнее массива на практике, хотя вставка O(1) на бумаге | узлы разбросаны по куче, промахи кэша при обходе | урок D3_algo |
| 133 | core | algo | Чем двусвязный список платит за удаление по указателю на сам узел без знания предыдущего | лишним указателем `prev` в каждом узле | урок D3_algo |
| 134 | base | algo | Сложность разворота списка тремя указателями | O(n) по времени, O(1) по памяти | урок D3_algo |
| 135 | core | algo | Зачем нужен третий указатель `next` | сохранить связь с остатком списка до перезаписи `curr->next` | урок D3_algo |
| 136 | base | algo | Сколько проходов по списку нужно, чтобы найти k-й элемент с конца без знания длины | один | урок D3_algo |
| 137 | core | algo | На сколько шагов вперёд продвигают ведущий указатель перед стартом совместного движения | на k шагов | урок D3_algo |
| 138 | base | algo | На сколько узлов за шаг двигается `fast` в поиске середины | на 2, `slow` — на 1 | урок D3_algo |
| 139 | core | algo | Что вернёт `find_middle` для списка из 4 узлов (1→2→3→4) | узел 3 (второй из двух средних) | урок D3_algo |
| 140 | deep | algo | Почему условие цикла | `fast && fast->next`, а не только `fast`? — без `fast->next` обращение `fast->next->next` на последнем узле разыменует `nullptr` | урок D3_algo |
| 141 | base | algo | С какой относительной скоростью `fast` догоняет `slow` внутри цикла | 1 узел за шаг | урок D3_algo |
| 142 | core | algo | Сколько указателей нужно сбросить в голову списка, чтобы найти вход в цикл после первой встречи | один, второй остаётся в точке встречи, оба идут дальше по 1 шагу | урок D3_algo |
| 143 | deep | algo | Почему после первой встречи путь от головы длиной `a` и путь от точки встречи длиной `c-b` сходятся в одной точке | из равенства `2(a+b) = a+b+n·c`, откуда `a = (n-1)c + (c-b)` | урок D3_algo |
| 144 | base | algo | Что решает dummy-узел | убирает отдельную ветку кода для вставки/удаления в начало списка | урок D3_algo |
| 145 | core | algo | Что возвращают в конце вместо dummy | `dummy->next` как настоящую голову результата | урок D3_algo |
| 146 | base | algo | Сложность push/pop у стека на массиве | O(1) | урок D3_algo |
| 147 | core | algo | Сколько раз за свою жизнь в очереди на двух стеках элемент перекладывается между `in` и `out` | не более одного раза | урок D3_algo |
| 148 | core | algo | Средняя (амортизированная) сложность pop в очереди на двух стеках | O(1), несмотря на то что отдельный вызов с переливом стоит O(n) | урок D3_algo |
| 149 | base | algo | Формула перехода индекса на начало массива в кольцевом буфере | `idx = (idx + 1) % capacity` | урок D3_algo |
| 150 | base | algo | Сложность push/pop в кольцевом буфере | O(1), без сдвига элементов | урок D3_algo |
| 151 | core | algo | Как отличить полный кольцевой буфер от пустого, если `head == tail` | счётчик `size`, либо держать одну ячейку всегда свободной | урок D3_algo |
| 152 | core | algo | Более быстрая замена `% capacity` без деления | `if (++idx == capacity) idx = 0;` | урок D3_algo |
| 153 | deep | algo | Где кольцевой буфер встречается в драйверах | буферы DMA и приёма/передачи пакетов, head/tail двигаются независимо без перемещения данных | урок D3_algo |
| 154 | base | algo | Наивная сложность Next Greater Element вложенным циклом | O(n²) | урок D3_algo |
| 155 | base | algo | Сложность Next Greater Element через монотонный стек | O(n) | урок D3_algo |
| 156 | core | algo | Почему монотонный стек даёт O(n), если внутри есть вложенный `while` | каждый индекс кладётся в стек и снимается не более одного раза, суммарно ≤2n операций за весь проход | урок D3_algo |
| 157 | core | algo | Что хранит монотонный стек в задаче Next Greater Element | значения или индексы? — индексы (значения по ним убывают снизу вверх) | урок D3_algo |
| 158 | deep | algo | Чем Daily Temperatures отличается от Next Greater Element по сути алгоритма | тем же алгоритмом, но в ответ пишут расстояние в днях, а не значение | урок D3_algo |
| 159 | base | linux | Какие два флага компиляции нужны для комфортной отладки в gdb | `-g -O0` | урок D3_gdb |
| 160 | base | linux | Как называется формат отладочной информации, который встраивает `-g` | DWARF | урок D3_gdb |
| 161 | core | linux | Почему `-O2` мешает отладке даже при наличии `-g` | оптимизатор переставляет/удаляет инструкции и переиспользует регистры, отладочная информация перестаёт однозначно совпадать с исходником | урок D3_gdb |
| 162 | base | linux | Какая команда печатает стек вызовов в gdb | `bt` | урок D3_gdb |
| 163 | base | linux | Что означает `x/16xb ptr` | 16 байт в hex начиная с адреса `ptr` (формат `x/NFU addr`) | урок D3_gdb |
| 164 | core | linux | Чем `frame N` отличается от `bt` | `bt` печатает весь стек, `frame N` переключает текущий контекст `print`/`info locals` на конкретный кадр из этого стека | урок D3_gdb |
| 165 | base | linux | Чем `tbreak` отличается от `break` | `tbreak` удаляется автоматически после первого срабатывания | урок D3_gdb |
| 166 | core | linux | Чем `rwatch` отличается от `watch` | `watch` реагирует на изменение значения, `rwatch` — на чтение переменной | урок D3_gdb |
| 167 | deep | linux | Сколько аппаратных регистров отладки на x86 ограничивают число одновременных аппаратных watchpoint | 4 (`DR0`–`DR3`) | урок D3_gdb |
| 168 | base | linux | Чем `next` отличается от `step` | `next` не заходит внутрь вызываемых функций, `step` заходит | урок D3_gdb |
| 169 | core | linux | Что делает `finish` | выполняет до возврата из текущей функции и печатает возвращаемое значение | урок D3_gdb |
| 170 | core | linux | Зачем нужен `until` внутри цикла | продолжить до строки с номером больше текущей, не проходя цикл пошагово | урок D3_gdb |
| 171 | base | linux | Каким кодом завершается процесс при SIGSEGV | 139 (128+11) | урок D3_gdb |
| 172 | base | linux | Какой командой разрешить сохранение core-файлов перед ожиданием падения | `ulimit -c unlimited` | урок D3_gdb |
| 173 | core | linux | Как открыть core dump вместе с бинарником в gdb | `gdb prog core` | урок D3_gdb |
| 174 | core | linux | Почему пересборка бинарника перед анализом core ломает разбор | адреса в новом бинарнике не совпадают с адресами, записанными в core, gdb покажет несогласованный стек | урок D3_gdb |
| 175 | base | linux | Какая команда gdb показывает все потоки процесса разом | `info threads` | урок D3_gdb |
| 176 | core | linux | Как переключиться на конкретный поток по номеру для `bt`/`print` | `thread N` | урок D3_gdb |
| 177 | core | linux | Как gdb помогает диагностировать дедлок, если программа просто зависла без вывода | `info threads` + `bt` по каждому потоку показывают, кто на каком мьютексе застрял | урок D3_gdb |
| 178 | core | linux | В чём разница между точкой, которую покажет gdb при краше, и точкой, которую покажет ASAN | gdb показывает точку симптома (где реально упало), ASAN — точку причины (момент нарушения) | урок D3_gdb |
| 179 | base | linux | Каким флагом компиляции включается ASAN | `-fsanitize=address` | урок D3_gdb |
| 180 | base | linux | Каким флагом компиляции включается UBSAN | `-fsanitize=undefined` | урок D3_gdb |
| 181 | base | linux | Какой модуль valgrind ищет ошибки памяти | `memcheck` (`valgrind --tool=memcheck`) | урок D3_gdb |
| 182 | core | linux | Почему valgrind медленнее ASAN | эмулирует каждую машинную инструкцию в софтверной VM, а не добавляет проверки только вокруг обращений к памяти в нативном коде | урок D3_gdb |
| 183 | core | linux | Когда valgrind предпочтительнее санитайзеров | когда нет доступа к исходникам/пересборке (готовый бинарник, сторонняя библиотека) | урок D3_gdb |
| 184 | base | linux | Какой командой собирают `crash.c` для отладки с санитайзерами | `gcc -g -O0 -fsanitize=address,undefined crash.c -o crash` | урок D3_gdb |
| 185 | base | linux | Что печатает `./crash` без аргументов после починки | `len=5`, код возврата 0 | урок D3_gdb |
| 186 | core | linux | Почему падение может произойти не в строке с самой ошибкой, а при выходе из программы | испорченный служебный указатель (стек/метаданные кучи) проявляется только в момент разрушения объекта, а не в момент самой порчи | урок D3_gdb |
| 187 | base | threads | Когда именно стартует новый поток при `std::thread t(f)` | сразу, в конструкторе | урок D3_threads |
| 188 | base | threads | Примерный размер стека потока на типичной Linux-системе | ~8 МБ | урок D3_threads |
| 189 | core | threads | Что произойдёт, если объект `std::thread` с незавершённым и не присоединённым потоком уничтожится | `std::terminate`, программа аварийно завершится | урок D3_threads |
| 190 | core | threads | Каким системным вызовом Linux создаёт новый поток | `clone` | урок D3_threads |
| 191 | base | threads | Что такое data race | одновременный доступ к одной памяти минимум с одной записью без синхронизации | урок D3_threads |
| 192 | core | threads | Является ли гонка на обычном `int` без атомиков UB по стандарту C++ | да, даже если на конкретном железе чтение/запись `int` физически атомарны | урок D3_threads |
| 193 | core | threads | Почему компилятору мало того, что чтение `int` атомарно на железе | без синхронизации он вправе кэшировать значение в регистре и переупорядочивать обращения к памяти | урок D3_threads |
| 194 | base | threads | Какая RAII-обёртка нужна для работы с `condition_variable::wait` | `std::unique_lock` | урок D3_threads |
| 195 | base | threads | Что делает `std::scoped_lock` | атомарно захватывает несколько мьютексов сразу | урок D3_threads |
| 196 | core | threads | Почему дедлок ловится ThreadSanitizer, а не компилятором | это динамическая ошибка, зависящая от конкретной раскладки потоков в рантайме, а не от статической структуры кода | урок D3_threads |
| 197 | base | threads | Что атомарно делает `cv.wait(lock)` при входе | освобождает мьютекс и усыпляет поток одной неделимой операцией | урок D3_threads |
| 198 | core | threads | Почему `while`, а не `if`, вокруг `wait` | из-за spurious wakeup: `wait` может вернуться без единого вызова `notify` | урок D3_threads |
| 199 | core | threads | Обязательно ли вызывать `notify` под захваченным мьютексом | нет, обязательно лишь менять состояние под мьютексом; `notify` после `unlock()` — оптимизация, не требование корректности | урок D3_threads |
| 200 | deep | threads | На каком примитиве ОС реализован `condition_variable` на Linux | `futex` | урок D3_threads |
| 201 | core | threads | Назови 4 условия Коффмана для дедлока | взаимное исключение, удержание-и-ожидание, невозможность отбора, круговое ожидание | урок D3_threads |
| 202 | core | threads | Какое условие обычно разрушают на практике фиксированным порядком захвата мьютексов | круговое ожидание | урок D3_threads |
| 203 | base | threads | Какой командой gdb смотрят, на каком мьютексе застрял каждый поток при зависании | `info threads` (и стек каждого потока) | урок D3_threads |
| 204 | base | threads | Чем `std::atomic` дешевле мьютекса для простого счётчика | одна аппаратная инструкция (например CAS), без перехода в ядро и усыпления потока | урок D3_threads |
| 205 | core | threads | Что гарантирует `memory_order_relaxed` | только атомарность операции, без ограничений порядка с другими обращениями к памяти | урок D3_threads |
| 206 | core | threads | Что запрещает `acquire`, а что | `release`? — acquire запрещает переносить более поздние обращения ДО себя; release запрещает переносить более ранние обращения ПОСЛЕ себя | урок D3_threads |
| 207 | deep | threads | Сколько состояний у кэш-линии в протоколе MESI | 4 (Modified, Exclusive, Shared, Invalid) | урок D3_threads |
| 208 | deep | threads | Какой memory_order используется по умолчанию у операций `std::atomic` | `seq_cst` | урок D3_threads |
| 209 | base | threads | Каким исключением отвечает `push` после `close()` | `std::runtime_error` | урок D3_threads |
| 210 | core | threads | Почему `size()` в этой задаче требует того же мьютекса, что и данные очереди | инкремент/декремент — не атомарная операция read-modify-write, без синхронизации это гонка данных | урок D3_threads |
| 211 | base | threads | Примерно сколько потоков создают в пуле относительно ядер CPU | порядка числа ядер процессора | урок D3_threads |
| 212 | core | threads | Какую конкретно цену амортизирует пул потоков | стоимость создания потока (системный вызов, стек, регистрация в планировщике) на каждую отдельную короткую задачу | урок D3_threads |
| 213 | base | threads | Что возвращает `std::async` сразу после вызова | `std::future` с будущим результатом | урок D3_threads |
| 214 | core | threads | Сколько раз можно вызвать `future.get()` для одного результата | один; второй вызов — неопределённое поведение (`valid() == false`) | урок D3_threads |
| 215 | base | threads | Каким флагом компиляции включается ThreadSanitizer | `-fsanitize=thread` | урок D3_threads |
| 216 | core | threads | Почему чистый прогон под TSan не гарантирует отсутствие гонки в коде вообще | TSan ловит гонку по факту конкретной раскладки потоков в конкретном запуске, а не статическим анализом всех возможных раскладок | урок D3_threads |
| 217 | base | algo | Память матрицы смежности для V вершин | O(V²) | урок D4_algo |
| 218 | base | algo | Память списка смежности | O(V+E) | урок D4_algo |
| 219 | core | algo | Сложность перебора всех соседей вершины в списке смежности | O(deg(v)), в матрице — всегда O(V) | урок D4_algo |
| 220 | core | algo | Почему для графа 100 000 вершин нужен список смежности, а не матрица | матрица заняла бы 10¹⁰ ячеек, не влезает в память | урок D4_algo |
| 221 | base | algo | Сложность BFS на списке смежности | O(V+E) | урок D4_algo |
| 222 | base | algo | Какую структуру данных использует BFS | очередь (FIFO) | урок D4_algo |
| 223 | core | algo | Что гарантированно находит BFS в невзвешенном графе | кратчайший путь по числу рёбер от источника | урок D4_algo |
| 224 | core | algo | Почему BFS даёт кратчайший путь именно из-за очереди, а не из-за чего-то ещё | FIFO-порядок раскрывает граф строго по слоям расстояния, вершина расстояния k не может обработаться раньше всех вершин расстояния <k | урок D4_algo |
| 225 | base | algo | Сложность DFS на списке смежности | O(V+E) | урок D4_algo |
| 226 | base | algo | Какую структуру данных использует DFS | стек (явный или стек вызовов рекурсии) | урок D4_algo |
| 227 | core | algo | Гарантирует ли DFS кратчайший путь | нет, в отличие от BFS | урок D4_algo |
| 228 | deep | algo | Почему рекурсивный DFS опасен на графе-цепочке из 100 000 вершин | глубина рекурсии равна длине цепочки, стек вызовов переполняется | урок D4_algo |
| 229 | base | algo | Сложность подсчёта связных компонент через BFS/DFS от каждой непосещённой вершины | O(V+E), суммарно по всем запускам | урок D4_algo |
| 230 | core | algo | Что в задаче Number of Islands является «вершиной» и «ребром» | вершина — клетка `'1'`, ребро — соседство по 4 направлениям | урок D4_algo |
| 231 | base | algo | Для какого типа графа определена топологическая сортировка | направленный ациклический граф (DAG) | урок D4_algo |
| 232 | base | algo | Сложность алгоритма Кана | O(V+E) | урок D4_algo |
| 233 | core | algo | Что такое степень входа вершины в алгоритме Кана | число входящих в неё рёбер (нерассмотренных зависимостей) | урок D4_algo |
| 234 | core | algo | Как алгоритм Кана обнаруживает цикл | счётчик обработанных вершин `order.size()` меньше `n` после завершения | урок D4_algo |
| 235 | core | algo | Как задача Course Schedule сводится к топологической сортировке | курсы — вершины, пререквизит — направленное ребро, цикл = невозможно пройти все курсы | урок D4_algo |
| 236 | base | algo | Обязательное условие применимости Дейкстры | все веса рёбер неотрицательны (w ≥ 0) | урок D4_algo |
| 237 | base | algo | Сложность наивной Дейкстры (без кучи) | O(V²) | урок D4_algo |
| 238 | core | algo | Сложность Дейкстры с `priority_queue` | O((V+E) log V) | урок D4_algo |
| 239 | core | algo | Почему отрицательное ребро ломает Дейкстру | вершина считается решённой сразу после извлечения минимума, а отрицательное ребро из ещё не рассмотренной вершины теоретически могло бы уменьшить это «зафиксированное» расстояние | урок D4_algo |
| 240 | core | algo | Что проверяет `if (d != dist[v]) continue;` в реализации на куче | что извлечённая запись не устарела (для v уже нашли путь короче) | урок D4_algo |
| 241 | deep | algo | Почему куча может держать до O(E) записей вместо O(V) | при каждом улучшении расстояния в кучу кладётся новая запись вместо обновления старой (нет decrease-key) | урок D4_algo |
| 242 | base | algo | Сложность Беллман-Форда | O(V·E) | урок D4_algo |
| 243 | base | algo | Сколько раз алгоритм проходит по всем рёбрам в основном цикле | V-1 раз | урок D4_algo |
| 244 | core | algo | Как Беллман-Форд обнаруживает отрицательный цикл | если расстояние ещё можно уменьшить на дополнительной V-й итерации, в графе есть отрицательный цикл | урок D4_algo |
| 245 | core | algo | Почему V-1 итераций достаточно | кратчайший путь без отрицательных циклов не может содержать больше V-1 ребра (иначе повторяет вершину) | урок D4_algo |
| 246 | base | algo | Какие два приёма дают почти-константную сложность union-find | сжатие пути и объединение по рангу | урок D4_algo |
| 247 | base | algo | Амортизированная сложность операции union-find с обоими приёмами | O(α(n)), обратная функция Аккермана, практически O(1) | урок D4_algo |
| 248 | core | algo | Сложность алгоритма Kruskal и что в ней доминирует | O(E log E), доминирует сортировка рёбер | урок D4_algo |
| 249 | core | algo | Как union-find решает Redundant Connection | первое ребро, для которого `unite` вернул false (вершины уже в одной компоненте), и есть лишнее | урок D4_algo |
| 250 | core | algo | Как Network Delay Time сводится к Дейкстре | вершина k — источник, ответ — максимум из всех кратчайших расстояний, -1 если что-то недостижимо | урок D4_algo |
| 251 | deep | algo | Каково верхнее ограничение обратной функции Аккермана для практических n | α(n) ≤ 4 для любого n, меньшего числа атомов во вселенной | урок D4_algo |
| 252 | base | net | Сколько уровней в модели OSI | 7 | урок D4_net |
| 253 | base | net | Сколько уровней в модели TCP/IP | 4 | урок D4_net |
| 254 | core | net | Какие три уровня OSI объединяет прикладной уровень TCP/IP | сеансовый, представления, прикладной | урок D4_net |
| 255 | core | net | На каком уровне создаётся сокет | транспортном (L4 OSI / транспортный TCP/IP) | урок D4_net |
| 256 | base | net | Размер заголовка TCP-сегмента (без опций) | 20 байт | урок D4_net |
| 257 | base | net | Размер заголовка IP-пакета (без опций) | 20 байт | урок D4_net |
| 258 | base | net | Размер заголовка Ethernet-кадра и трейлера FCS | 14 байт заголовок + 4 байта FCS | урок D4_net |
| 259 | core | net | По какому полю верхний уровень при приёме узнаёт, что лежит внутри нижнего | по полю типа протокола (EtherType в Ethernet, `protocol` в IP) | урок D4_net |
| 260 | base | net | Длина Ethernet-заголовка | 14 байт | урок D4_net |
| 261 | base | net | Длина трейлера FCS | 4 байта | урок D4_net |
| 262 | base | net | Длина MAC-адреса в битах и байтах | 48 бит, 6 байт | урок D4_net |
| 263 | core | net | Из скольки байт состоит OUI в MAC-адресе и кто его назначает | 3 байта, назначает IEEE производителю | урок D4_net |
| 264 | core | net | Что меняется в заголовках при переходе пакета через маршрутизатор | MAC или IP получателя? — MAC-адрес получателя, IP остаётся прежним | урок D4_net |
| 265 | base | net | Как рассылается ARP-запрос | broadcast или unicast? — broadcast | урок D4_net |
| 266 | base | net | Как отправляется ARP-ответ | unicast, от владельца адреса | урок D4_net |
| 267 | core | net | Зачем нужен ARP-кэш | не повторять broadcast-запрос для каждого исходящего пакета к уже известному узлу | урок D4_net |
| 268 | core | net | Что такое gratuitous ARP и для чего он нужен | незапрошенный ARP про собственный IP; обновление чужих кэшей заранее и обнаружение конфликта адресов | урок D4_net |
| 269 | base | net | Сколько байт добавляет VLAN-тег 802.1Q к Ethernet-заголовку | 4 байта (14 → 18) | урок D4_net |
| 270 | base | net | Значение поля TPID для VLAN-тега | 0x8100 | урок D4_net |
| 271 | core | net | Из каких трёх полей состоит TCI и сколько бит занимает VID | PCP (3 бита), DEI (1 бит), VID (12 бит) | урок D4_net |
| 272 | core | net | Диапазон реально используемых VLAN ID | 1–4094 (0 и 4095 зарезервированы) | урок D4_net |
| 273 | base | net | Значение MTU для стандартного Ethernet | 1500 байт | урок D4_net |
| 274 | core | net | Что происходит с IP-пакетом крупнее MTU, если флаг DF не выставлен | фрагментируется на несколько IP-пакетов меньшего размера | урок D4_net |
| 275 | core | net | Что происходит, если пакет крупнее MTU и выставлен флаг DF | пакет отбрасывается, отправителю летит ICMP о необходимости фрагментации | урок D4_net |
| 276 | deep | net | Почему фрагментация считается дорогой операцией | нагружает маршрутизаторы на пути, и потеря одного фрагмента роняет весь исходный пакет | урок D4_net |
| 277 | base | net | Минимальный размер IPv4-заголовка | 20 байт | урок D4_net |
| 278 | base | net | Значение поля Protocol для TCP / UDP / ICMP | 6 / 17 / 1 | урок D4_net |
| 279 | core | net | Сколько бит занимает поле IHL и что оно означает | 4 бита, длина заголовка в 32-битных словах | урок D4_net |
| 280 | core | net | Какие условия делают IPv4-пакет некорректным при разборе (по `tasks/04_ipv4`) | буфер <20 байт, version≠4, ihl<5, ihl·4>len, total_length<ihl·4 или >len | урок D4_net |
| 281 | deep | net | Почему в `tasks/04_ipv4` запрещён `reinterpret_cast` на буфер | невыровненный адрес и другой порядок байт на проводе дают UB при чтении полей как структуры напрямую | урок D4_net |
| 282 | base | net | На сколько уменьшается TTL на каждом маршрутизаторе | на 1 | урок D4_net |
| 283 | base | net | Какой ICMP-тип отправляется при обнулении TTL | Time Exceeded, тип 11 | урок D4_net |
| 284 | core | net | Как traceroute находит промежуточные маршрутизаторы, не имея отдельного протокола обнаружения пути | последовательно шлёт пакеты с TTL=1,2,3..., каждый умирает на очередном хопе и присылает ICMP Time Exceeded с адресом этого хопа | урок D4_net |
| 285 | base | net | Номера типов Echo Request и Echo Reply | 8 и 0 | урок D4_net |
| 286 | base | net | Тип ICMP-сообщения Destination Unreachable | тип 3 | урок D4_net |
| 287 | core | net | Какой код Destination Unreachable запускает PMTUD | fragmentation needed and DF set | урок D4_net |
| 288 | core | net | Почему ICMP не имеет портов | диагностика работает на сетевом уровне, где ещё нет понятия транспортного соединения | урок D4_net |
| 289 | deep | net | Почему `ping` может не проходить, а `curl` на тот же хост | работать? — ICMP заблокирован файрволом отдельно от TCP-порта, это два разных уровня фильтрации | урок D4_net |
| 290 | base | net | Алгоритм контрольной суммы IPv4-заголовка | сумма в дополнительном коде по 16-битным словам, затем инверсия | урок D4_net |
| 291 | core | net | Какое значение должна давать сумма при проверке валидности (с учётом поля суммы) | 0xFFFF | урок D4_net |
| 292 | core | net | Почему контрольная сумма покрывает только заголовок, а не данные | заголовок (минимум TTL) меняется на каждом хопе и пересчитывается заново; целостность данных проверяют TCP/UDP-checksum и FCS канального уровня | урок D4_net |
| 293 | deep | net | Что такое end-around carry в one's complement сложении | перенос из старшего бита не отбрасывается, а прибавляется обратно к младшему биту суммы | урок D4_net |
| 294 | base | net | Сколько хостов доступно в подсети /24 | 254 | урок D4_net |
| 295 | base | net | Сколько хостов доступно в подсети /26 | 62 | урок D4_net |
| 296 | base | net | Сколько хостов доступно в подсети /30 | 2 | урок D4_net |
| 297 | core | net | Чем /31 отличается от остальных масок по числу служебных адресов | оба адреса хостовые (RFC 3021), нет отдельного сетевого/broadcast адреса | урок D4_net |
| 298 | core | net | Что означает запись `/N` в CIDR | длина префикса сети в битах вместо классовой адресации A/B/C | урок D4_net |
| 299 | deep | net | Формула подбора самой узкой подсети под h хостов за O(1) | `32 - ceil(log2(h+2))` | урок D4_net |
| 300 | base | net | На каком уровне работает хаб / коммутатор / маршрутизатор | L1 / L2 / L3 | урок D4_net |
| 301 | base | net | Что такое FDB коммутатора по структуре данных | хеш-таблица MAC-адрес → порт | урок D4_net |
| 302 | core | net | Как коммутатор заполняет FDB без отдельного протокола объявления | самообучением по source MAC каждого входящего кадра | урок D4_net |
| 303 | core | net | Что делает коммутатор с кадром, чей MAC получателя не найден в FDB | рассылает на все порты кроме входного (flooding) | урок D4_net |
| 304 | core | net | Зачем нужен aging записей FDB | удалять устаревшие пары MAC-порт, если устройство отключилось или переехало на другой порт | урок D4_net |
| 305 | deep | net | Что разделяет маршрутизатор, чего не делает коммутатор | широковещательные домены (домены коллизий разделяет уже коммутатор) | урок D4_net |
| 306 | base | algo | Два условия применимости ДП | оптимальная подструктура + перекрывающиеся подзадачи | урок D5_algo |
| 307 | core | algo | Почему наивный рекурсивный `fib(n)` работает за экспоненциальное время | одни и те же подзадачи (`fib(k)` для одного и того же k) пересчитываются заново много раз | урок D5_algo |
| 308 | core | algo | Что ломается, если применить ДП-переход к задаче без оптимальной подструктуры | переход не отражает реальную зависимость оптимумов, ответ будет неверным независимо от таблицы | урок D5_algo |
| 309 | base | algo | Сложность по времени мемоизации/табуляции | O(число состояний) | урок D5_algo |
| 310 | core | algo | Чем мемоизация рискует, а табуляция | нет? — переполнением стека при большой глубине рекурсии | урок D5_algo |
| 311 | core | algo | Что нужно определить в ДП-задаче до написания кода | состояние (параметры подзадачи) и переход (формула через уже решённые состояния) | урок D5_algo |
| 312 | base | algo | Сложность по памяти Climbing Stairs при развёрнутых `prev1`/`prev2` | O(1) | урок D5_algo |
| 313 | core | algo | Почему рюкзак 0/1 нельзя ужать до O(1), только до O(W) | переход `dp[i][w]` зависит от целой предыдущей строки по весу, а не от 1–2 соседних чисел | урок D5_algo |
| 314 | base | algo | Временная сложность 0/1-рюкзака с одномерным массивом | O(n·W) | урок D5_algo |
| 315 | core | algo | Почему в одномерном 0/1-рюкзаке веса обходят от W к weight[i], а не наоборот | иначе `dp[w-weight[i]]` уже обновлён текущим предметом в этой же итерации, предмет посчитается дважды | урок D5_algo |
| 316 | deep | algo | Как называется вариант рюкзака, в который случайно превращается 0/1-рюкзак при прямом проходе весов | unbounded knapsack (неограниченное число копий предмета) | урок D5_algo |
| 317 | base | algo | Сложность Coin Change (минимум монет) по времени | O(amount · число_номиналов) | урок D5_algo |
| 318 | core | algo | Какой порядок циклов в Coin Change II даёт число комбинаций, а какой | перестановок? — монета снаружи/сумма внутри → комбинации; сумма снаружи/монета внутри → перестановки | урок D5_algo |
| 319 | base | algo | Размер таблицы LCS/Edit Distance для строк длины n и m | (n+1)×(m+1) | урок D5_algo |
| 320 | base | algo | Временная сложность LCS и Edit Distance | O(n·m) | урок D5_algo |
| 321 | core | algo | Почему при несовпадении последних символов в LCS берут max(dp[i-1][j], dp[i][j-1]) | оба последних символа одновременно в общую подпоследовательность войти не могут, значит хотя бы один из них можно отбросить без потери оптимальности | урок D5_algo |
| 322 | base | algo | Наивная сложность LIS через dp[i] | O(n²) | урок D5_algo |
| 323 | base | algo | Сложность LIS через массив хвостов и бинарный поиск | O(n log n) | урок D5_algo |
| 324 | core | algo | Что хранится в `tails[k]` | минимально возможный последний элемент возрастающей подпоследовательности длины k+1 | урок D5_algo |
| 325 | core | algo | Почему `tails` остаётся отсортированным после каждой замены/добавления | новое значение всегда меньше заменяемого и больше всех элементов левее позиции, найденной `lower_bound` | урок D5_algo |
| 326 | core | algo | `lower_bound` или `upper_bound` нужен для строго возрастающей LIS | `lower_bound` | урок D5_algo |
| 327 | deep | algo | Сколько операций у наивного O(n²) LIS на 100 000 элементах и почему это не укладывается в тест | порядка 10¹⁰, тест роняет прогон при времени > 2 с | урок D5_algo |
| 328 | base | linux | Чей код возврата хранит `$?` после `cmd1 | cmd2 | cmd3` | только последней команды (`cmd3`) | урок D5_bash |
| 329 | core | linux | Как узнать код возврата каждой команды пайплайна отдельно | массив `PIPESTATUS` (`${PIPESTATUS[@]}`) | урок D5_bash |
| 330 | base | linux | Что делает `-e` в `set -euo pipefail` | скрипт завершается сразу при ненулевом коде возврата любой команды | урок D5_bash |
| 331 | base | linux | Что делает `-u` | обращение к неопределённой переменной — ошибка вместо пустой строки | урок D5_bash |
| 332 | core | linux | Что делает `pipefail` и какую проблему из раздела 1 это закрывает | код возврата пайплайна = код первой упавшей команды, а не только последней; закрывает потерю ошибок середины пайплайна | урок D5_bash |
| 333 | core | linux | В каком месте `-e` не остановит скрипт при ошибке команды | если команда — часть условия (`if`, `while`, после `&&`/`||`) или не последняя команда пайплайна без `pipefail` | урок D5_bash |
| 334 | base | linux | Что по умолчанию входит в IFS | пробел, таб, перевод строки | урок D5_bash |
| 335 | base | linux | Что хранит `$!` | PID последнего фонового процесса | урок D5_bash |
| 336 | core | linux | Зачем `trap ... EXIT` используют для временных файлов | гарантирует очистку при любом пути завершения скрипта (успех, ошибка, сигнал), без дублирования кода в каждой точке выхода | урок D5_bash |
| 337 | base | linux | Чем `-0` в `xargs -0` отличается от поведения по умолчанию | вход разделяется нулевыми байтами `\0` вместо пробелов/переводов строк | урок D5_bash |
| 338 | core | linux | С какой опцией `find` обычно комбинируют `xargs -0` | `-print0` | урок D5_bash |
| 339 | base | linux | Что печатает `grep -c` | количество совпавших строк, а не сами строки | урок D5_bash |
| 340 | base | linux | Почему `uniq -c` нужно применять после `sort` | `uniq` схлопывает только соседние одинаковые строки, несмежные повторы не видит | урок D5_bash |
| 341 | core | linux | Чем `sort -u` эквивалентен по результату | `sort | uniq`, но за один проход | урок D5_bash |
| 342 | base | linux | Что означает `$1` в awk | первое поле текущей строки | урок D5_bash |
| 343 | base | linux | Что содержит `NR` | номер текущей строки от начала потока | урок D5_bash |
| 344 | core | linux | Почему awk на 1e6 строк быстрее bash-цикла с grep внутри | awk — один процесс с линейным проходом по строкам, bash-цикл форкает новый процесс на каждую итерацию (миллион fork+exec против одного процесса) | урок D5_bash |
| 345 | base | linux | Что делает флаг `g` в `s/OLD/NEW/g` | заменяет все вхождения в строке, а не только первое | урок D5_bash |
| 346 | core | linux | Чем `sed -i` отличается от `sed` без флага | редактирует файл на месте вместо печати результата в stdout | урок D5_bash |
| 347 | base | linux | Что такое /proc с точки зрения хранения данных | виртуальная файловая система, содержимое генерируется ядром на лету, не хранится на диске | урок D5_bash |
| 348 | base | linux | Чем разделены аргументы в /proc/<pid>/cmdline | нулевыми байтами `\0` | урок D5_bash |
| 349 | core | linux | Что можно узнать из /proc/<pid>/maps | диапазоны адресов памяти процесса, права доступа (r/w/x) и к какому файлу/сегменту относится каждый диапазон | урок D5_bash |
| 350 | core | linux | Откуда `free -h` берёт данные о памяти | из /proc/meminfo | урок D5_bash |
| 351 | base | linux | Что ограничивает `ulimit -n` | максимальное число открытых файловых дескрипторов на процесс | урок D5_bash |
| 352 | core | linux | Почему перед отладкой редкого краша выставляют `ulimit -c unlimited` | по умолчанию размер core dump часто ограничен нулём, без этого файл с состоянием памяти на момент падения не создастся | урок D5_bash |
| 353 | base | linux | Расшифровка прав 755 | rwxr-xr-x (владелец: полный доступ, группа и остальные: чтение+выполнение) | урок D5_bash |
| 354 | base | linux | Какие числа кодируют r, w, x | r=4, w=2, x=1 | урок D5_bash |
| 355 | core | linux | Что делает `umask 022` с правами нового файла по умолчанию (666) | вычитает 022, получается 644 (rw-r--r--) | урок D5_bash |
| 356 | base | linux | Что показывает `strace` | системные вызовы процесса с аргументами и результатом, построчно | урок D5_bash |
| 357 | core | linux | Чем `lsof -p PID` и `/proc/<pid>/fd/` пересекаются по смыслу | оба показывают список файловых дескрипторов, открытых процессом | урок D5_bash |
| 358 | base | net | Минимальный размер заголовка TCP | 20 байт | урок D5_net |
| 359 | base | net | Сколько бит занимает порт в заголовке TCP | 16 бит (диапазон 0–65535) | урок D5_net |
| 360 | core | net | Максимальный размер опций TCP-заголовка и почему именно столько | 40 байт, потому что Data Offset (4 бита) кодирует длину заголовка в 32-битных словах максимум 15×4=60 байт, минус 20 байт фиксированной части | урок D5_net |
| 361 | core | net | В каких сегментах передаётся опция MSS | только в сегментах с флагом SYN, при установке соединения | урок D5_net |
| 362 | deep | net | Какие два флага TCP появились позже исходного RFC 793 и для чего | ECE и CWR (RFC 3168), сигнализация перегрузки сети (ECN) вместо/вместе с потерей пакета | урок D5_net |
| 363 | base | net | Сколько сегментов в three-way handshake | 3 (SYN, SYN+ACK, ACK) | урок D5_net |
| 364 | core | net | Почему для установки TCP-соединения недостаточно двух сегментов | соединение полнодуплексное, серверу нужно подтверждение, что его SYN-ACK (и его ISN) реально дошёл до клиента | урок D5_net |
| 365 | core | net | Что означает ISN и синхронизируется ли он в одном экземпляре на оба направления | начальный порядковый номер; нет, у каждого направления свой собственный ISN | урок D5_net |
| 366 | base | net | В каком состоянии сервер ждёт входящие подключения | LISTEN | урок D5_net |
| 367 | core | net | Чем отличаются пути клиента и сервера в конечном автомате TCP | клиент проходит SYN_SENT, сервер — LISTEN и SYN_RECEIVED; роли в рукопожатии асимметричны | урок D5_net |
| 368 | core | net | Какой командой в Linux видно текущее состояние TCP-сокета | `ss -tan` (столбец State) | урок D5_net |
| 369 | base | net | Сколько сегментов нужно для полного закрытия TCP-соединения | 4 (FIN, ACK, FIN, ACK) | урок D5_net |
| 370 | base | net | Формула длительности TIME_WAIT | 2×MSL | урок D5_net |
| 371 | core | net | Почему закрытие TCP асимметрично («полузакрытие»), а не мгновенное закрытие по первому FIN | соединение дуплексное, получение FIN означает только «собеседник больше не пришлёт данные», но сама сторона может ещё дописывать данные в обратном направлении | урок D5_net |
| 372 | deep | net | Сколько секунд реально длится TIME_WAIT в Linux и совпадает ли это с 2×MSL по RFC 793 | 60 секунд, фиксированная константа ядра; не совпадает с номинальными 4 минутами (2×2 мин) по RFC 793 | урок D5_net |
| 373 | base | net | Что получает клиент в ответ на попытку подключиться к закрытому порту | RST | урок D5_net |
| 374 | core | net | Чем RST принципиально отличается от FIN по смыслу | RST — аварийный немедленный сброс (ошибка/невозможность продолжить), FIN — согласованное закрытие направления | урок D5_net |
| 375 | base | net | Чем измеряется flow control в заголовке TCP | полем Window | урок D5_net |
| 376 | core | net | Чем отличается flow control от congestion control по цели | flow control защищает получателя от переполнения буфера, congestion control защищает сеть от перегрузки | урок D5_net |
| 377 | core | net | Во сколько раз падает cwnd при обнаруженной потере | вдвое (ssthresh = cwnd/2) | урок D5_net |
| 378 | core | net | Что такое fast retransmit | ретрансмиссия по 3 дублирующим ACK без ожидания полного таймаута RTO | урок D5_net |
| 379 | deep | net | Какой алгоритм congestion control используется в Linux по умолчанию | CUBIC | урок D5_net |
| 380 | core | net | Формула RTO по Джекобсону/Карелсу | SRTT + 4×RTTVAR | урок D5_net |
| 381 | deep | net | Какие коэффициенты сглаживания используются для SRTT и RTTVAR | α=1/8 для SRTT, β=1/4 для RTTVAR | урок D5_net |
| 382 | base | net | Что делает флаг TCP_NODELAY | отключает алгоритм Нейгла, данные отправляются сразу без задержки на накопление | урок D5_net |
| 383 | core | net | Почему Nagle + delayed ACK вместе дают заметные задержки | обе стороны ждут друг друга: отправитель — ACK перед следующей мелкой отправкой, получатель — данные для отправки в обратную сторону, чтобы не слать ACK отдельно | урок D5_net |
| 384 | base | net | Размер заголовка UDP | 8 байт | урок D5_net |
| 385 | base | net | Какие поля есть в заголовке UDP | порт источника, порт назначения, длина, контрольная сумма | урок D5_net |
| 386 | core | net | Почему DNS исторически использует UDP, а не TCP | типичный запрос-ответ короткий и умещается в одну датаграмму, устанавливать TCP-соединение ради одного маленького обмена избыточно медленно | урок D5_net |
| 387 | base | net | Диапазон well-known портов | 0–1023 | урок D5_net |
| 388 | base | net | В каком диапазоне ОС обычно выделяет эфемерные порты клиентским соединениям | 49152–65535 | урок D5_net |
| 389 | core | net | Что вернёт второй `bind` на уже занятый порт | ошибку «Address already in use» | урок D5_net |
| 390 | base | net | Что делает NAT с исходящим пакетом | подменяет внутренний IP:порт источника на внешний IP:порт, запоминая соответствие в таблице трансляций | урок D5_net |
| 391 | core | net | Почему NAT ломает входящие P2P-соединения без проброса портов | запись в таблице трансляций создаётся только исходящим трафиком, входящему от незнакомого узла не с чем сопоставиться | урок D5_net |
| 392 | base | net | Порт DNS по умолчанию и протокол | 53, UDP (переключение на TCP/53 для больших ответов) | урок D5_net |
| 393 | base | net | Что хранит запись типа A | соответствие имени домена IPv4-адресу | урок D5_net |
| 394 | core | net | Зачем у DNS-записи есть TTL | ограничивает время кэширования резолверами; компромисс между скоростью распространения изменений и нагрузкой повторными запросами | урок D5_net |
| 395 | base | net | Порты DHCP-сервера и клиента | сервер 67/UDP, клиент 68/UDP | урок D5_net |
| 396 | core | net | Из каких четырёх шагов состоит DORA | Discover, Offer, Request, Ack | урок D5_net |
| 397 | base | net | Команда для захвата TCP-трафика на 80 порту | `tcpdump tcp port 80` | урок D5_net |
| 398 | base | net | Флаг tcpdump для сохранения дампа в файл | `-w` | урок D5_net |
| 399 | core | net | Как в выводе tcpdump выглядит three-way handshake | три строки подряд: `[S]` от клиента, `[S.]` от сервера, `[.]` от клиента | урок D5_net |
| 400 | base | tools | Из каких двух механизмов ядра Linux состоит изоляция контейнера | namespaces (изоляция видимости ресурсов) и cgroups (ограничение потребления ресурсов) | урок D6_docker |
| 401 | base | tools | Перечисли namespaces, разбираемые в этом разделе | pid, mnt, net, uts, ipc, user | урок D6_docker |
| 402 | core | tools | Почему контейнер стартует за доли секунды, а VM | за секунды? — контейнер не грузит собственное ядро, старт — это fork/exec с применёнными namespaces; VM грузит через гипервизор целое гостевое ядро | урок D6_docker |
| 403 | core | tools | Почему изоляция контейнера слабее, чем у VM, на уровне безопасности | контейнер и хост используют одно и то же ядро; уязвимость ядра или неверные capabilities могут дать выход на хост, а у VM с отдельным ядром такой прямой путь отсутствует | урок D6_docker |
| 404 | base | tools | Что порождает каждая инструкция `RUN`/`COPY` в Dockerfile | отдельный слой (diff файловой системы) | урок D6_docker |
| 405 | core | tools | Что происходит с последующими слоями, если один слой не совпал с кэшем | все последующие слои пересобираются заново, даже если сами по себе не менялись | урок D6_docker |
| 406 | core | tools | Какой порядок инструкций Dockerfile правильный для скорости пересборки | сначала зависимости (меняются редко), потом исходный код (меняется часто) | урок D6_docker |
| 407 | base | tools | Почему `apt-get install` и `rm -rf /var/lib/apt/lists/*` объединяют в одну инструкцию `RUN` | слой фиксирует файловую систему на момент завершения инструкции; в отдельном RUN кеш пакетов уже необратимо запечён в предыдущем слое | урок D6_docker |
| 408 | core | tools | Почему нельзя копировать в образ каталог `build/`, собранный на хосте | он собран под окружение хоста (версия компилятора, пути, архитектура), не гарантированно совместим с окружением контейнера; сборка должна идти внутри образа | урок D6_docker |
| 409 | base | tools | Что переносит `COPY --from=builder` во второй `FROM` | только указанные готовые файлы (например бинарник) из первого этапа, без слоёв тулчейна | урок D6_docker |
| 410 | core | tools | Когда для финального этапа multi-stage можно использовать `FROM scratch` | когда бинарник собран полностью статически и не нуждается ни в одной библиотеке окружения | урок D6_docker |
| 411 | core | tools | Чем `debian:bookworm-slim` в качестве финального образа лучше полного `debian:bookworm` для рантайма | не несёт тулчейн сборки и лишние пакеты, меньше размер и меньше поверхность атаки | урок D6_docker |
| 412 | base | tools | Кто физически управляет расположением volume на диске | сам Docker, служебная директория, не путь, выбранный вручную | урок D6_docker |
| 413 | core | tools | Почему bind mount, а не volume, используют для разработки с редактированием кода на хосте | bind mount даёт прямой одновременный доступ к каталогу хоста, правки на хосте сразу видны в контейнере без пересборки образа | урок D6_docker |
| 414 | base | tools | Что делает флаг `--rm` у `docker run` | автоматически удаляет контейнер и его read-write-слой сразу после завершения процесса | урок D6_docker |
| 415 | base | tools | Какая команда даёт интерактивный shell в уже запущенном контейнере | `docker exec -it <container> bash` | урок D6_docker |
| 416 | core | tools | Чем `--network=host` отличается от обычного режима с `-p` | контейнер напрямую использует сетевой стек хоста без собственного network namespace и без проброса портов, но и без сетевой изоляции | урок D6_docker |
| 417 | base | tools | Какая команда поднимает все сервисы из `docker-compose.yml` разом | `docker compose up -d` | урок D6_docker |
| 418 | core | tools | Что удаляет `docker compose down -v`, чего не удаляет `docker compose down` без флага | именованные volume и данные в них | урок D6_docker |
| 419 | base | tools | Что физически происходит с тегом `:latest` при каждом `docker push` без явного тега | он перезаписывается на новый образ, становится мутируемым указателем, а не фиксированной версией | урок D6_docker |
| 420 | core | tools | Почему фиксация `myapp@sha256:...` вместо тега `:latest` важна для воспроизводимости CI | дайджест неизменяем по определению хеша, а тег `:latest` может незаметно указывать на другое содержимое образа в разное время | урок D6_docker |
| 421 | base | tools | От какого пользователя запускается процесс в контейнере по умолчанию, если не указано иное | root (UID 0) | урок D6_docker |
| 422 | core | tools | Почему root в контейнере опаснее, чем root в отдельной VM | контейнер не имеет отдельного ядра; эскалация до root хоста возможна через уязвимость общего ядра, неверные capabilities или смонтированный docker.sock, чего с отдельным ядром VM добиться сложнее | урок D6_docker |
| 423 | core | tools | Что делает флаг `--user uid:gid` | запускает процесс контейнера от непривилегированного UID/GID вместо root | урок D6_docker |
| 424 | base | tools | Каким сигналом и с каким кодом завершения убивает процесс превышение лимита `--memory` | SIGKILL, код завершения 137 (128 + 9) | урок D6_docker |
| 425 | core | tools | Что ограничивает `--cpus=1.5` технически | квоту CPU-контроллера cgroups, эквивалент 1.5 ядра процессорного времени вне зависимости от простаивающих ядер хоста | урок D6_docker |
| 426 | base | linux | В каком кольце защиты x86 работает ядро Linux | в кольце 0 (пользовательские процессы — в кольце 3) | урок D6_kernel |
| 427 | base | linux | Какая инструкция делает системный вызов на x86-64 | `syscall` (на ARM — `svc`) | урок D6_kernel |
| 428 | core | linux | Почему системный вызов | отдельная инструкция процессора, а не обычный `call`? — обычный `call` не меняет уровень привилегий CPU, а переход в кольцо 0 требует именно смены режима процессора | урок D6_kernel |
| 429 | base | linux | Чем `insmod` отличается от `modprobe` | `insmod` грузит модуль по прямому пути без разрешения зависимостей, `modprobe` находит модуль по имени и сам подгружает зависимости | урок D6_kernel |
| 430 | base | linux | Какая команда показывает метаданные модуля, не загружая его | `modinfo` | урок D6_kernel |
| 431 | core | linux | Откуда `modprobe` берёт карту зависимостей модулей | из файла `modules.dep`, который строит утилита `depmod` | урок D6_kernel |
| 432 | base | linux | Какой макрос ядра | аналог `printf`? — `printk` | урок D6_kernel |
| 433 | base | linux | Команда для чтения буфера сообщений ядра | `dmesg` | урок D6_kernel |
| 434 | core | linux | Сколько уровней важности у `printk` и какие крайние | 8 уровней, от `KERN_EMERG` (0) до `KERN_DEBUG` (7) | урок D6_kernel |
| 435 | core | linux | Кто вызывает функции, зарегистрированные `module_init`/`module_exit` | ядро автоматически, при `insmod`/`modprobe` и `rmmod` соответственно, а не сам программист | урок D6_kernel |
| 436 | base | linux | Как передать параметр модулю при загрузке | `insmod modname.ko имя_параметра=значение` | урок D6_kernel |
| 437 | core | linux | Что означает третий аргумент `module_param`, если он ненулевой | параметр публикуется файлом в `/sys/module/<имя>/parameters/<имя>` с заданными правами доступа | урок D6_kernel |
| 438 | base | linux | Чем отличается соглашение о содержимом файлов `/sys` от `/proc` | в `/sys` одно значение на файл, в `/proc` файл может содержать несколько значений свободным текстом | урок D6_kernel |
| 439 | core | linux | Откуда `cat /proc/meminfo` берёт данные | ядро формирует ответ на лету в момент чтения, это не файл на диске | урок D6_kernel |
| 440 | base | linux | Какие 4 обработчика минимально нужны в `file_operations` символьного драйвера | `.open`, `.read`, `.write`, `.release` | урок D6_kernel |
| 441 | core | linux | Что означают major и minor номера устройства | major определяет драйвер, minor — конкретный экземпляр устройства внутри этого драйвера | урок D6_kernel |
| 442 | core | linux | Сколько бит под major и minor в `dev_t` | 12 бит major, 20 бит minor (32-битное число целиком) | урок D6_kernel |
| 443 | core | linux | Почему в драйвере нельзя напрямую разыменовать указатель из user space | это чужое адресное пространство, страница может быть не загружена или указатель некорректен; прямое разыменование роняет ядро или блокируется SMAP/SMEP | урок D6_kernel |
| 444 | base | linux | В какой функции `file_operations` реализуется `ioctl` | `.unlocked_ioctl` | урок D6_kernel |
| 445 | core | linux | Зачем коды ioctl-команд собирают через `_IO`/`_IOR`/`_IOW`/`_IOWR`, а не пишут произвольным числом | макросы кодируют направление передачи, магическое число драйвера и номер команды, снижая риск коллизии кодов между разными драйверами | урок D6_kernel |
| 446 | base | linux | Во что компилируется `.dts` и какой утилитой | в бинарный `.dtb`, утилитой `dtc` | урок D6_kernel |
| 447 | core | linux | Зачем device tree вообще нужен, если можно было бы прописать адреса регистров прямо в коде драйвера | один и тот же бинарник ядра работает на разных платах без пересборки под каждую; хардкод адресов требовал бы правки и компиляции ядра под каждую конкретную плату | урок D6_kernel |
| 448 | base | linux | Что задаёт переменная `CROSS_COMPILE` | префикс имени инструментов тулчейна (например `arm-linux-gnueabihf-`) | урок D6_kernel |
| 449 | core | linux | Что произойдёт при запуске бинарника, собранного с неверным `-march`, на реальной плате | крах «illegal instruction» (процессор не поддерживает часть использованных инструкций) или отказ сборки | урок D6_kernel |
| 450 | core | linux | Какую проблему в embedded снимает статическая линковка | несовпадение версии динамических библиотек (например glibc) на целевой плате с версией сборки | урок D6_kernel |
| 451 | base | linux | В каком порядке идёт цепочка загрузки платы | Boot ROM → U-Boot → ядро+dtb → initramfs → переключение на настоящий rootfs → init (PID 1) | урок D6_kernel |
| 452 | core | linux | Зачем нужен initramfs, если ядро уже загружено и работает | ядру для монтирования настоящего диска может понадобиться драйвер, который сам является модулем и ещё не загружен; initramfs даёт минимальную среду в памяти, чтобы его подгрузить перед переходом на постоянный rootfs | урок D6_kernel |
| 453 | base | linux | Что делает `volatile` с точки зрения компилятора | заставляет реально выполнять каждое обращение к памяти по адресу, не кэшируя значение в регистре и не убирая повторные чтения/записи | урок D6_kernel |
| 454 | core | linux | Даёт ли `volatile` атомарность или барьер памяти между несколькими ядрами CPU | нет, только запрещает компилятору кэшировать/убирать обращения к конкретной переменной | урок D6_kernel |
| 455 | core | linux | Какая функция ядра отображает физический адрес MMIO-региона в виртуальный адрес для доступа как к указателю | `ioremap()` | урок D6_kernel |
| 456 | deep | linux | Зачем нужен `wmb()` между записью DMA-дескриптора и записью в регистр запуска устройства | без барьера порядок этих двух записей, как его видит железо, не гарантирован, и устройство может прочитать старое содержимое дескриптора раньше, чем увидит новые данные | урок D6_kernel |
| 457 | base | general | Сколько уроков покрывает план перед D7 | 13 файлов (`D1_algo`…`D6_docker`) по алгоритмам, Linux, C++, сетям, потокам, отладке, bash и ядру | урок D7_mock |
| 458 | core | general | Где искать формулировки механизмов, если в уроке дня их не хватает | `HR_BASE_deep.md` | урок D7_mock |
| 459 | base | general | Сколько часов длится каждый мок сегодня | мок №1 (алгоритмы) 3 часа, мок №2 (системное) 2 часа | урок D7_mock |
| 460 | base | general | Средняя сложность операций хеш-таблицы | амортизированное O(1) | урок D7_mock |
| 461 | core | general | При каком load factor обычно триггерят rehash при open addressing | около 0.7 | урок D7_mock |
| 462 | core | general | Зачем capacity берут степенью двойки | `idx = hash & (cap - 1)` вместо дорогого деления по модулю | урок D7_mock |
| 463 | deep | general | Каков стандартный max_load_factor по умолчанию у `std::unordered_map` в большинстве реализаций (libstdc++, MSVC) | 1.0 | урок D7_mock |
| 464 | core | general | Какую кучу держат для потокового top-K наибольших элементов размера k | min-heap размера k | урок D7_mock |
| 465 | core | general | Средняя и худшая сложность nth_element | среднее O(n), худшее O(n²) | урок D7_mock |
| 466 | deep | general | Как получить top-K частых элементов за O(n) без log-множителя | подсчёт хеш-таблицей O(n) + bucket sort по частоте (массив корзин размера n+1) | урок D7_mock |
| 467 | base | general | Сложность обнаружения цикла алгоритмом Флойда по времени и памяти | O(n) время, O(1) память | урок D7_mock |
| 468 | core | general | Как найти вход в цикл после первой встречи указателей | сбросить один указатель на head, оба двигать по 1 шагу — встретятся на входе | урок D7_mock |
| 469 | base | general | Сложность BFS на сетке R×C | O(R·C) | урок D7_mock |
| 470 | core | general | Почему BFS гарантирует кратчайший путь по числу рёбер | FIFO-очередь раскрывает граф строго по слоям расстояния | урок D7_mock |
| 471 | core | general | В какой момент нужно помечать узел посещённым, чтобы избежать повторных вставок в очередь | в момент постановки в очередь, а не при извлечении | урок D7_mock |
| 472 | deep | general | Как обойти граф со весами рёбер только 0 и 1 за O(V+E) без полноценной Дейкстры | 0-1 BFS: deque, вес 0 — push_front, вес 1 — push_back | урок D7_mock |
| 473 | base | general | Временная и пространственная сложность LCS/Edit Distance | O(n·m) и по времени, и по памяти | урок D7_mock |
| 474 | core | general | Три операции, между которыми выбирают минимум в Edit Distance | замена, удаление, вставка | урок D7_mock |
| 475 | base | general | Сложность наивного LIS и продвинутого через tails[] | O(n²) и O(n log n) соответственно | урок D7_mock |
| 476 | core | general | Почему наивный O(n²) не проходит на N=100 000 за 2 секунды | 10¹⁰ операций, не укладывается в типичный лимит времени внутреннего теста | урок D7_mock |
| 477 | core | general | Что хранит tails[k] | минимальный возможный последний элемент возрастающей подпоследовательности длины k+1 | урок D7_mock |
| 478 | deep | general | Как называется классический приём построения tails[] с заменой через бинарный поиск | patience sorting (раскладка карт по кучкам) | урок D7_mock |
| 479 | core | general | sizeof той же структуры с полями в порядке char a; char c; int b | 8 байт | урок D7_mock |
| 480 | base | general | Что физически делает std::move во время выполнения | ничего: это static_cast к rvalue-ссылке | урок D7_mock |
| 481 | core | general | За какое время перемещается std::vector и что именно переносится | O(1): три внутренних указателя (начало, конец данных, конец ёмкости) | урок D7_mock |
| 482 | core | general | Флаг компилятора, включающий сразу ASAN и UBSAN | -fsanitize=address,undefined | урок D7_mock |
| 483 | base | general | Откуда взялись коды возврата 137 и 139 | 128 + номер сигнала: 137 = SIGKILL(9), 139 = SIGSEGV(11) | урок D7_mock |
| 484 | core | general | Какие два сигнала нельзя перехватить или заблокировать | SIGKILL (9) и SIGSTOP (19) | урок D7_mock |
| 485 | base | general | Состояние зомби-процесса в выводе ps | Z | урок D7_mock |
| 486 | core | general | Что именно занимает зомби-процесс | память или что-то другое? — слот в таблице процессов, не память | урок D7_mock |
| 487 | base | general | Жёсткий лимит select и его значение | FD_SETSIZE, 1024 | урок D7_mock |
| 488 | core | general | Сложность epoll_wait на одно готовое событие против select/poll на весь набор | epoll_wait O(1) на событие; select/poll O(n) на весь набор при каждом вызове | урок D7_mock |
| 489 | base | general | Разница MAP_SHARED и MAP_PRIVATE | MAP_SHARED: изменения видны другим и попадают в файл; MAP_PRIVATE: copy-on-write, изменения приватны | урок D7_mock |
| 490 | base | general | Длина Ethernet-заголовка и длина заголовка с VLAN-тегом | 14 байт без тега, 18 байт с тегом 802.1Q | урок D7_mock |
| 491 | core | general | Значение TPID и число бит поля VID | TPID = 0x8100, VID = 12 бит (диапазон 1–4094) | урок D7_mock |
| 492 | base | general | Сколько хостов доступно в подсети /26 и как выглядит маска в десятичном виде | 62 хоста, 255.255.255.192 | урок D7_mock |
| 493 | core | general | Сеть, broadcast и диапазон хостов для 10.0.1.130/26 | сеть 10.0.1.128, broadcast 10.0.1.191, хосты 129–190 | урок D7_mock |
| 494 | base | general | На сколько уменьшается TTL на каждом маршрутизаторе и какой ICMP-тип шлётся при обнулении | на 1; ICMP Time Exceeded, тип 11 | урок D7_mock |
| 495 | core | general | С какого TTL traceroute начинает зондирование и почему именно так восстанавливает маршрут | с TTL=1, наращивая на 1 — каждый пакет умирает на очередном хопе и раскрывает его адрес | урок D7_mock |
| 496 | base | general | Сколько сегментов в three-way handshake и в полном закрытии соединения | 3 (SYN, SYN+ACK, ACK) и 4 (FIN, ACK, FIN, ACK) | урок D7_mock |
| 497 | deep | general | Сколько секунд реально длится TIME_WAIT в Linux | 60 секунд (константа TCP_TIMEWAIT_LEN), не совпадает с номинальными 4 минутами по RFC 793 | урок D7_mock |
| 498 | base | general | Сколько вопросов работодателю стоит подготовить заранее на такое интервью | 8, каждый — конкретный, не риторический | урок D7_mock |
| 499 | core | general | Когда обычно задают вопросы работодателю на техническом скрининге | в конце интервью, по приглашению интервьюера | урок D7_mock |
| 500 | base | general | Из каких 4 частей состоит структура STAR для ответа про опыт | Situation, Task, Action, Result | урок D7_mock |
| 501 | core | general | Как правильно называть пробел в алгоритмах на собеседовании | скрывать или называть прямо? — называть прямо: конкретная тема добирается сейчас, с указанием, что уже понятно (сложность, инварианты) | урок D7_mock |
| 502 | base | algo | Сколько байт меняет местами `bswap32` | 4 | задача 01_bits |
| 503 | core | algo | Что делает `x & (x - 1)` | гасит младший единичный бит `x` | задача 01_bits |
| 504 | core | algo | Сколько итераций цикла `popcount32` на `x = 0xFFFFFFFF` | 32 (по числу единичных бит) | задача 01_bits |
| 505 | deep | algo | Почему `1u << 31` пишут с суффиксом `u`, а не как `int` | сдвиг знакового `int` в | задача 01_bits |
| 506 | base | algo | Какой порядок байт использует сеть для многобайтовых полей | network byte order | задача 01_bits |
| 507 | base | algo | Во сколько раз быстрее идёт `fast` относительно `slow` в паре двух указателей | в 2 раза | задача 02_list |
| 508 | core | algo | Почему рекурсивный разворот списка не годится под требование O(1) памяти | каждый | задача 02_list |
| 509 | core | algo | На чём основано доказательство, что `fast` догонит `slow` при цикле | внутри цикла | задача 02_list |
| 510 | base | algo | Сколько дополнительных указателей нужно для итеративного разворота списка | 3 | задача 02_list |
| 511 | base | algo | Сложность `push`/`pop` кольцевого буфера | O(1) | задача 03_ring |
| 512 | core | algo | Как отличить пустой буфер от полного при `head_ == tail_` | хранить отдельный | задача 03_ring |
| 513 | core | algo | Чем `delete[]` отличается от `delete` для массива, выделенного `new[]` | `delete` | задача 03_ring |
| 514 | base | algo | Какое условие делает `push` дешевле, чем `% capacity_` на каждый вызов | задача 03_ring | |
| 515 | base | net | Минимальная длина IPv4-заголовка без опций | 20 байт | задача 04_ipv4 |
| 516 | base | net | Код `protocol` для TCP / UDP / ICMP | 6 / 17 / 1 | задача 04_ipv4 |
| 517 | core | net | В каком порядке лежат `src_ip`/`dst_ip` в буфере согласно заданию | «как на проводе», | задача 04_ipv4 |
| 518 | core | net | Почему `reinterpret_cast` буфера в `Ipv4Header*` | UB? — нет гарантии выравнивания | задача 04_ipv4 |
| 519 | deep | net | Чему должна быть равна сумма в доп. коде по `ihl*4` байтам заголовка (вместе с полем | задача 04_ipv4 | |
| 520 | base | algo | Сложность наивного DP-решения LIS | O(n²) | задача 05_lis |
| 521 | core | algo | Сложность решения через `tails` + бинарный поиск | O(n log n) | задача 05_lis |
| 522 | deep | algo | Почему для строгого возрастания нужен `lower_bound`, а не `upper_bound` | задача 05_lis | |
| 523 | base | threads | Каким флагом компилятора включается ThreadSanitizer | `-fsanitize=thread` | задача 06_threads |
| 524 | base | threads | Что бросает `push` после `close()` | `std::runtime_error` | задача 06_threads |
| 525 | core | threads | Должен ли `size()` быть потокобезопасным в этой задаче | да, его тоже вызывают из другого потока и он тоже под захватом мьютекса | задача 06_threads |
| 526 | core | threads | Что происходит с ждущими потоками при `close()` | все разблокируются (никакого вечного `wait`) | задача 06_threads |
| 527 | core | threads | Почему `while` вокруг `wait`, а не `if` | из-за spurious wakeup: `wait` может вернуться без вызова notify | задача 06_threads |
| 528 | core | threads | Чем опасен один `condition_variable` на два разных предиката вместе с `notify_one` | можно разбудить не тот поток, а нужный останется ждать | задача 06_threads |
| 529 | base | threads | Какой командой запускается проверка задачи 06 | `python3 grade.py 06` | задача 06_threads |
| 530 | core | threads | Почему TSan может не показать гонку при одном прогоне, даже если она есть в коде | он ловит гонку по факту конкретной раскладки потоков в этом запуске, а не статическим анализом | задача 06_threads |
| 531 | base | linux | На каком адресе и с каким флагом сокета должен слушать сервер | 127.0.0.1, `SO_REUSEADDR` | задача 07_epoll |
| 532 | base | linux | Сколько одновременных соединений сервер должен держать минимум | 64 | задача 07_epoll |
| 533 | core | linux | По какому событию сервер закрывает соединение с клиентом | по EOF со стороны клиента | задача 07_epoll |
| 534 | base | linux | Что означает `EAGAIN` на неблокирующем сокете | не ошибка, сигнал «данных пока нет, попробуй позже» | задача 07_epoll |
| 535 | core | linux | В чём разница между LT и ET режимами epoll | LT сообщает о готовности, пока данные остаются в буфере; ET — один раз, при переходе «не готов → готов» | задача 07_epoll |
| 536 | deep | linux | Какая асимптотика у `epoll_wait` относительно select/poll | O(1) на готовое событие против O(n) на весь набор у select/poll | задача 07_epoll |
| 537 | base | linux | Каким кодом возврата должен завершаться сервер по SIGTERM/SIGINT | 0 | задача 07_epoll |
| 538 | core | linux | Что возвращает `epoll_wait`, если его прервал сигнал | -1 с `errno == EINTR`, не ошибка выполнения | задача 07_epoll |
| 539 | base | linux | Сколько соединений открывает тест `grade.py 07` | 3 | задача 07_epoll |
| 540 | base | linux | Каким сигналом тест проверяет корректное завершение сервера | SIGTERM | задача 07_epoll |
| 541 | base | linux | Сколько строк TOP выводится, если уникальных IP меньше трёх | столько, сколько есть уникальных IP | задача 08_bash |
| 542 | base | linux | Что печатает скрипт для пустого файла | `TOTAL 0`, `5XX 0`, без строк TOP | задача 08_bash |
| 543 | core | linux | По какому полю строки лога определяется IP | по первому полю | задача 08_bash |
| 544 | core | linux | Почему `while read line` в bash медленный на миллионе строк | каждая итерация — это работа интерпретатора bash, а вызов внешних утилит из цикла — ещё и `fork+exec` на строку | задача 08_bash |
| 545 | core | linux | Что даёт связка awk + sort вместо построчного цикла | один проход по файлу целиком специализированным бинарником вместо миллиона запусков процессов | задача 08_bash |
| 546 | deep | linux | По какому полю сортируется список IP при равенстве числа запросов | по возрастанию строки IP (вторичный ключ сортировки) | задача 08_bash |
| 547 | base | linux | Что делает `set -e` | останавливает скрипт при первой команде с ненулевым кодом возврата | задача 08_bash |
| 548 | core | linux | В каких позициях `set -e` не останавливает скрипт при ошибке команды | в условиях `if`/`while`/`until`, слева/справа от `&&`/`||`, после `!` | задача 08_bash |
| 549 | core | linux | Почему `local var=$(cmd)` не ловится `set -e`, если `cmd` упал | итоговый код возврата строки — это код возврата `local`, а он 0 даже при упавшей подстановке внутри | задача 08_bash |
| 550 | core | linux | Зачем `set -o pipefail` отдельно от `set -e` | без него код возврата конвейера — это код возврата только последней команды, падение команды посередине конвейера остаётся незамеченным | задача 08_bash |
| 551 | base | linux | Каким кодом возврата должен завершаться `solution.sh` при успехе | 0 | задача 08_bash |
| 552 | core | linux | Что именно сверяет `grade.py 08` с эталоном | точное совпадение вывода (все четыре строки) на фикстуре и на большом логе | задача 08_bash |
| 553 | core | linux | Какие два санитайзера должны не давать сообщений после починки | ASan и UBSan (`-fsanitize=address,undefined`) | задача 09_gdb |
| 554 | base | linux | Что даёт флаг `-g` при сборке для gdb | отладочную информацию (DWARF): соответствие адресов строкам, именам и типам переменных | задача 09_gdb |
| 555 | core | linux | Почему для отладки собирают с `-O0`, а не с `-O2` | оптимизатор переставляет/удаляет инструкции и переиспользует регистры, из-за чего строки и значения в отладчике перестают однозначно соответствовать исходнику | задача 09_gdb |
| 556 | core | linux | Что ловит ASan из перечисленного: выход за границы, use-after-free, двойное освобождение | все три, в момент обращения к памяти, а не постфактум | задача 09_gdb |
| 557 | deep | linux | Что именно ловит UBSan, в отличие от ASan | неопределённое поведение по стандарту C (знаковое переполнение, сдвиг за пределы разрядности), а не ошибки работы с памятью | задача 09_gdb |
| 558 | base | linux | Какая команда gdb показывает цепочку вызовов до краша | `bt` | задача 09_gdb |
| 559 | core | linux | Чем `watch var` отличается от обычного `break` | останавливает выполнение при каждом изменении значения переменной, а не в заданной точке кода | задача 09_gdb |
| 560 | core | linux | Зачем нужен `frame N` после `bt` | переключает контекст `print`/`info locals` на конкретный кадр стека, чтобы смотреть переменные не только текущей функции | задача 09_gdb |
| 561 | base | linux | Сколько входов прогоняет `grade.py 09` | 5 | задача 09_gdb |
| 562 | base | linux | Каким компилятором собирается `crash.c` на проверке | gcc (компилятор C) | задача 09_gdb |
| 563 | base | algo | Сколько времени закладывается на задачу 10 | 1,5–2,5 часа со ступенями | задача 10_hash |
| 564 | base | algo | Какой командой проверяется решение | `python3 grade.py 10` | задача 10_hash |
| 565 | deep | algo | Где в реальных устройствах используется похожая структура | таблицы MAC-адресов (FDB) коммутатора, кэши сессий — открытая адресация с жёсткими ограничениями по памяти | задача 10_hash |
| 566 | base | algo | Почему `hash & (cap-1)` эквивалентно `hash % cap` | только если `cap` — степень двойки: `cap-1` в двоичном виде — маска из всех младших бит, AND с ней даёт тот же результат, что остаток от деления | задача 10_hash |
| 567 | base | algo | Пример: `cap=8` (маска `0b111`), `hash=19` (`0b10011`). Индекс | `19 & 7 = 3` | задача 10_hash |
| 568 | core | algo | Среднее число проб при удачном поиске, load factor 0.7 | ≈2,2 (формула Кнута `0.5·(1+1/(1-0.7))`) | задача 10_hash |
| 569 | core | algo | То же при load factor 0.9 | ≈5,5 — рост почти в 2,5 раза от значения при 0.7 | задача 10_hash |
| 570 | deep | algo | Среднее число проб при НЕудачном поиске, load factor 0.9 | ≈50,5 (`0.5·(1+1/(1-0.9)²)`) — на порядок хуже удачного поиска | задача 10_hash |
| 571 | core | algo | Почему `EMPTY` вместо `TOMBSTONE` после удаления ломает поиск чужих ключей | поиск идёт по цепочке проб до первой `EMPTY`; если такая ячейка появляется раньше искомого ключа, элементы за ней в этой цепочке становятся ненаходимыми, хотя физически на месте | задача 10_hash |
| 572 | base | algo | Сколько ключей вставляет тест на кластеризацию и какие они | 512 ключей, кратных 16 | задача 10_hash |
| 573 | base | algo | За какое время должны пройти 100 000 вставок | быстрее 2 секунд | задача 10_hash |
| 574 | base | algo | Какой порог load factor держит таблица | ≤ 0.7 | задача 10_hash |
| 575 | base | algo | Минимальная ёмкость таблицы по умолчанию | 16, степень двойки | задача 10_hash |
| 576 | base | algo | Индексы детей и родителя в max-heap на массиве | дети `2i+1`, `2i+2`; родитель `(i-1)/2` | задача 11_heap |
| 577 | base | algo | Что за 2 секунды должны выполниться на 3 000 000 элементов | `heapify` и `kth_largest` с `k=1000` (по отдельности) | задача 11_heap |
| 578 | base | algo | Какой ключевой запрет на реализацию `heapify` | нельзя строить через `push` в цикле, только bottom-up за O(n) | задача 11_heap |
| 579 | base | algo | Сложность доступа к максимуму (`top`) | O(1), максимум всегда в корне по инварианту кучи | задача 11_heap |
| 580 | base | algo | Сложность одного `sift-up`/`sift-down` от произвольного узла | O(log n) — путь ограничен высотой дерева | задача 11_heap |
| 581 | core | algo | Что сравнивается на каждом шаге `sift-down` | узел с обоими детьми; меняется местами с бОльшим из них, если тот больше узла | задача 11_heap |
| 582 | core | algo | За какое время строится куча через n последовательных `push` | O(n log n): сумма `Σ log₂(i)` по всем вставкам ≈ `n log₂ n` | задача 11_heap |
| 583 | core | algo | За какое время строится куча через bottom-up heapify | O(n): работа в узле пропорциональна его высоте `h`, а ряд `Σ h/2^h` сходится к константе, а не растёт с `n` | задача 11_heap |
| 584 | deep | algo | С какого индекса начинается bottom-up heapify и в какую сторону идёт | с последнего нелистового узла `n/2 - 1`, к корню (индекс 0) | задача 11_heap |
| 585 | core | algo | Во сколько раз push-цикл медленнее bottom-up heapify по числу сравнений при n=3 000 000 | примерно на порядок (~10 раз): `log₂(3·10⁶) ≈ 21,5` против константы ~2 у bottom-up | задача 11_heap |
| 586 | base | algo | Сложность `kth_largest`/`top_k` через полную кучу | O(n + k log n): O(n) на heapify плюс k раз pop по O(log n) | задача 11_heap |
| 587 | core | algo | Когда используют min-heap размера k вместо полной кучи на весь массив | на потоке данных, который не помещается в память: min-heap размера k хранит только k текущих кандидатов, сложность O(n log k), память O(k) | задача 11_heap |
| 588 | core | algo | Чем `std::nth_element` отличается от кучи для top-K | в среднем O(n), даёт частичный порядок вокруг k-го элемента, но не отсортированный список и без гарантии худшего случая; куча всегда O(n + k log n) и отдаёт элементы по убыванию через pop | задача 11_heap |
| 589 | base | algo | Что возвращает функция при `src == dst` | 0 | задача 12_dijkstra |
| 590 | base | algo | Что возвращает функция при недостижимости `dst` | -1 | задача 12_dijkstra |
| 591 | base | algo | В каком типе суммируются веса и почему не `int` | `long long`; веса суммируются до 10^9, `int` может переполниться на длинном пути | задача 12_dijkstra |
| 592 | base | algo | Сложность наивной Дейкстры (перебор минимума по массиву) | O(V²) | задача 12_dijkstra |
| 593 | base | algo | Сложность Дейкстры с бинарной кучей | O((V+E) log V) | задача 12_dijkstra |
| 594 | core | algo | При V=100 000, E=200 000, почему наивный O(V²) не укладывается в 2 секунды | 100 000² = 10^10 операций против ≈5·10^6 у варианта с кучей — разница на 3–4 порядка | задача 12_dijkstra |
| 595 | core | algo | Что означает «ленивое удаление» устаревших записей в очереди | вместо decrease-key при каждом улучшении расстояния в кучу пушится новая пара (dist, v); при извлечении запись с `d != dist[v]` пропускается как устаревшая | задача 12_dijkstra |
| 596 | deep | algo | Почему `std::priority_queue` не используют с decrease-key напрямую | у контейнера-адаптера нет интерфейса для обновления произвольного элемента за O(log n); дешевле каждый раз пушить новую запись и лениво отбрасывать устаревшие при pop | задача 12_dijkstra |
| 597 | core | algo | Почему Дейкстра ломается на отрицательных рёбрах | алгоритм считает расстояние до извлечённой из очереди вершины окончательным; отрицательное ребро может позже уменьшить это расстояние, но вершина уже не пересматривается | задача 12_dijkstra |
| 598 | base | algo | Какой алгоритм нужен при отрицательных весах без отрицательных циклов | Беллман-Форд, O(V·E) | задача 12_dijkstra |
| 599 | base | algo | Почему self-loop с w≥0 не требует отдельной обработки | добавление неотрицательного веса к текущему расстоянию никогда не уменьшает его, значит такое ребро никогда не выигрывает релаксацию | задача 12_dijkstra |
| 600 | base | net | Сколько узлов даёт /24 | 254 | задача 13_subnet |
| 601 | base | net | Сколько узлов даёт /26 | 62 | задача 13_subnet |
| 602 | base | net | Сколько узлов даёт /30 | 2 | задача 13_subnet |
| 603 | base | net | Сеть, broadcast и диапазон узлов для `10.0.1.130/26` | сеть `10.0.1.128`, broadcast `10.0.1.191`, узлы `129..190` | задача 13_subnet |
| 604 | base | net | Формула маски для префикса p (0<p≤32) | `0xFFFFFFFF << (32-p)`; для p=0 маска = 0 отдельным случаем (сдвиг на 32 — UB) | задача 13_subnet |
| 605 | base | net | Как получить network и broadcast из ip и mask | `network = ip & mask`, `broadcast = network | ~mask` | задача 13_subnet |
| 606 | core | net | Формула host_count для prefix ≤ 30 | `2^(32-prefix) - 2` | задача 13_subnet |
| 607 | core | net | Почему /31 | исключение и даёт 2 узла вместо 0 по общей формуле? — RFC 3021: у канала точка-точка ровно 2 узла, broadcast не нужен, поэтому оба адреса 2-адресного блока отдаются под хосты вместо потери половины блока | задача 13_subnet |
| 608 | core | net | Что возвращает subnet_of для /32 | network=broadcast=first_host=last_host=ip, host_count=1 (host route/loopback) | задача 13_subnet |
| 609 | core | net | Формула `prefix_for_hosts(h)` | `32 - ceil(log2(h+2))`, из условия `2^(32-prefix) >= h+2` | задача 13_subnet |
| 610 | deep | net | Почему `prefix_for_hosts(63) = 25`, а не 26, хотя 62 меньше 63 всего на 1 | /26 даёт только 62 узла, этого не хватает даже на 1 хост меньше требуемых 63; нужно расширить хостовую часть на 1 бит — /25 с 126 узлами | задача 13_subnet |