План v2 по диагностике (квиз 14/32) + 4 новые задачи (hash, heap, dijkstra, subnet) + тренажёр 60 карточек

This commit is contained in:
Kodlo-chan
2026-09-23 17:15:36 +07:00
parent 16b211eeda
commit 165dd5619d
19 changed files with 1429 additions and 136 deletions
+591
View File
@@ -0,0 +1,591 @@
{
"version": 1,
"note": "Карточки под промахи квиза 23.09: точные числа, сложности и условия.",
"facts": [
{
"domain": "algo",
"q": "Средняя сложность поиска в хеш-таблице при разумной загрузке?",
"a": "амортизированное O(1)",
"accept": [
"o(1)",
"амортизированное o(1)",
"o(1) амортизированное",
"амортизированно o(1)"
]
},
{
"domain": "algo",
"q": "Худшая сложность поиска в хеш-таблице (все ключи в одну корзину)?",
"a": "O(n)",
"accept": [
"o(n)"
]
},
{
"domain": "algo",
"q": "Сколько сравнений в худшем случае у бинарного поиска в массиве из 1 000 000 элементов?",
"a": "20",
"accept": [
"20",
"log2 1e6 = 20",
"около 20"
]
},
{
"domain": "algo",
"q": "При каком условии применим алгоритм Дейкстры?",
"a": "веса рёбер неотрицательны",
"accept": [
"неотрицательные веса",
"все веса >= 0",
"веса неотрицательны",
"нет отрицательных рёбер"
]
},
{
"domain": "algo",
"q": "Чем заменить Дейкстру при отрицательных рёбрах?",
"a": "Беллман–Форд",
"accept": [
"беллман-форд",
"беллман форд",
"bellman-ford"
]
},
{
"domain": "algo",
"q": "Сложность построения кучи (heapify) из произвольного массива?",
"a": "O(n)",
"accept": [
"o(n)",
"о(n)"
]
},
{
"domain": "algo",
"q": "Сложность вставки одного элемента в кучу?",
"a": "O(log n)",
"accept": [
"o(log n)"
]
},
{
"domain": "algo",
"q": "Какая сортировка устойчивая: merge, quick, heap или selection?",
"a": "merge sort",
"accept": [
"merge",
"merge sort",
"слиянием",
"сортировка слиянием"
]
},
{
"domain": "algo",
"q": "Худшая сложность quicksort?",
"a": "O(n²)",
"accept": [
"o(n^2)",
"o(n²)",
"o(n2)"
]
},
{
"domain": "algo",
"q": "Средняя сложность quicksort и mergesort?",
"a": "O(n log n)",
"accept": [
"o(n log n)",
"o(n*logn)",
"o(nlogn)"
]
},
{
"domain": "algo",
"q": "Для какого графа возможна топологическая сортировка?",
"a": "для ациклического (DAG)",
"accept": [
"dag",
"ациклический",
"без циклов",
"dag (ациклический)"
]
},
{
"domain": "algo",
"q": "Как найти цикл в связном списке за O(1) дополнительной памяти?",
"a": "алгоритм Флойда: черепаха и заяц",
"accept": [
"флойд",
"черепаха и заяц",
"алгоритм флойда"
]
},
{
"domain": "algo",
"q": "BFS или DFS даёт кратчайший путь в невзвешенном графе?",
"a": "BFS",
"accept": [
"bfs",
"обход в ширину"
]
},
{
"domain": "algo",
"q": "Сложность Дейкстры на priority_queue (двоичная куча)?",
"a": "O((V+E) log V)",
"accept": [
"o((v+e) log v)",
"o((v+e)logv)",
"o(e log v)"
]
},
{
"domain": "algo",
"q": "За какую сложность ищется НВП (LIS) в оптимальном решении?",
"a": "O(n log n)",
"accept": [
"o(n log n)",
"o(nlogn)",
"o(n*log n)"
]
},
{
"domain": "algo",
"q": "Сложность задачи о рюкзаке 0/1 через ДП по вместимости?",
"a": "O(n * W)",
"accept": [
"o(n*w)",
"o(nw)",
"o(n*w)"
]
},
{
"domain": "algo",
"q": "Насколько быстро работают операции union-find с эвристиками?",
"a": "почти O(1), O(α(n))",
"accept": [
"почти o(1)",
"o(alpha(n))",
"o(α(n))",
"обратная функция аккермана"
]
},
{
"domain": "algo",
"q": "Какова сложность по памяти рекурсивного DFS в графе в худшем случае?",
"a": "O(V) — глубина стека рекурсии",
"accept": [
"o(v)",
"o(h)",
"o(v) в худшем случае"
]
},
{
"domain": "algo",
"q": "Какова нижняя оценка сложности сортировки сравнениями?",
"a": "O(n log n)",
"accept": [
"o(n log n)",
"o(nlogn)"
]
},
{
"domain": "algo",
"q": "Структура для поиска слов по префиксу за O(len)?",
"a": "trie (префиксное дерево)",
"accept": [
"trie",
"префиксное дерево",
"бор"
]
},
{
"domain": "linux",
"q": "Что делает fork()?",
"a": "создаёт новый процесс (свой PID, COW-копия памяти)",
"accept": [
"создаёт новый процесс",
"создает новый процесс",
"новый процесс"
]
},
{
"domain": "linux",
"q": "Что происходит со страницами памяти при fork()?",
"a": "copy-on-write: копируются при первой записи",
"accept": [
"cow",
"copy-on-write",
"копирование при записи"
]
},
{
"domain": "linux",
"q": "Какой механизм держит десятки тысяч соединений в одном потоке?",
"a": "epoll",
"accept": [
"epoll",
"эполл"
]
},
{
"domain": "linux",
"q": "Сложность select против epoll на большом числе дескрипторов?",
"a": "select — O(n) по всем, epoll — O(1) на готовое событие",
"accept": [
"select o(n), epoll o(1)",
"epoll o(1)",
"o(1) на готовое"
]
},
{
"domain": "linux",
"q": "Что даёт mmap() на файл?",
"a": "отображает файл в память; страницы подгружаются по обращению",
"accept": [
"отображает файл в память",
"mmap файла в память",
"отображение файла в память"
]
},
{
"domain": "linux",
"q": "Зачем родителю waitpid()?",
"a": "чтобы забрать код возврата и не оставлять зомби",
"accept": [
"забрать код возврата",
"убрать зомби",
"чтобы не остались зомби"
]
},
{
"domain": "linux",
"q": "Что такое процесс-зомби?",
"a": "завершившийся процесс, чья запись ждёт wait/waitpid",
"accept": [
"завершившийся процесс без wait",
"ждёт wait",
"запись ждёт wait"
]
},
{
"domain": "linux",
"q": "Код возврата 137 — что это?",
"a": "SIGKILL (128+9) — убит",
"accept": [
"sigkill",
"128+9",
"убит sigkill"
]
},
{
"domain": "linux",
"q": "Код возврата 139 — что это?",
"a": "SIGSEGV (128+11) — падение по памяти",
"accept": [
"sigsegv",
"128+11",
"сегфолт"
]
},
{
"domain": "linux",
"q": "Что означает errno EAGAIN на неблокирующем сокете?",
"a": "данных сейчас нет, повторить позже",
"accept": [
"повторить позже",
"нет данных, попробовать снова",
"данных нет"
]
},
{
"domain": "linux",
"q": "Что такое TID (Thread ID) в /proc?",
"a": "номер задачи в /proc/<pid>/task/",
"accept": [
"номер задачи",
"task",
"в /proc/<pid>/task"
]
},
{
"domain": "linux",
"q": "Что делает ulimit -n?",
"a": "показывает/меняет лимит открытых файловых дескрипторов",
"accept": [
"лимит дескрипторов",
"лимит открытых файлов",
"число открытых файлов"
]
},
{
"domain": "linux",
"q": "Сигнал с номером 15?",
"a": "SIGTERM — запрос на завершение",
"accept": [
"sigterm",
"sigterm (мягкое завершение)",
"запрос на завершение"
]
},
{
"domain": "linux",
"q": "Сколько байт в заголовке TCP без опций?",
"a": "20",
"accept": [
"20",
"20 байт"
]
},
{
"domain": "net",
"q": "Сколько байт в Ethernet-заголовке без VLAN?",
"a": "14",
"accept": [
"14",
"14 байт"
]
},
{
"domain": "net",
"q": "Сколько байт добавляет VLAN-тег 802.1Q?",
"a": "4",
"accept": [
"4",
"4 байта"
]
},
{
"domain": "net",
"q": "Сколько адресов узлов в подсети /26?",
"a": "62",
"accept": [
"62",
"62 узла"
]
},
{
"domain": "net",
"q": "Сколько адресов узлов в подсети /24?",
"a": "254",
"accept": [
"254"
]
},
{
"domain": "net",
"q": "Какое поле IPv4-заголовка уменьшается на 1 на каждом маршрутизаторе?",
"a": "TTL",
"accept": [
"ttl"
]
},
{
"domain": "net",
"q": "Правильная последовательность установки TCP-соединения?",
"a": "SYN -> SYN-ACK -> ACK",
"accept": [
"syn, syn-ack, ack",
"syn syn-ack ack",
"syn -> syn-ack -> ack"
]
},
{
"domain": "net",
"q": "Что делает ARP?",
"a": "находит MAC по IP в локальном сегменте",
"accept": [
"mac по ip",
"ip -> mac",
"находит mac по ip"
]
},
{
"domain": "net",
"q": "Размер MTU Ethernet по умолчанию?",
"a": "1500 байт",
"accept": [
"1500"
]
},
{
"domain": "net",
"q": "На каком уровне OSI работает обычный коммутатор?",
"a": "L2 (канальный)",
"accept": [
"l2",
"канальный",
"2"
]
},
{
"domain": "net",
"q": "На каком уровне OSI работает маршрутизатор?",
"a": "L3 (сетевой)",
"accept": [
"l3",
"сетевой",
"3"
]
},
{
"domain": "net",
"q": "Сколько байт в минимальном IPv4-заголовке?",
"a": "20",
"accept": [
"20"
]
},
{
"domain": "net",
"q": "По какому протоколу и порту работает DNS?",
"a": "UDP/53 (при больших ответах TCP/53)",
"accept": [
"udp 53",
"53",
"udp/53"
]
},
{
"domain": "net",
"q": "Что означает маска /30 в адресах?",
"a": "4 адреса: сеть, 2 узла, broadcast",
"accept": [
"4 адреса, 2 узла",
"2 узла",
"сеть+2 узла+broadcast"
]
},
{
"domain": "net",
"q": "Что делает ICMP Time Exceeded?",
"a": "сообщает, что TTL истёк (используется в traceroute)",
"accept": [
"ttl истёк",
"истёк ttl",
"сообщает об истечении ttl"
]
},
{
"domain": "c_cpp",
"q": "Чему равен sizeof(struct S { char a; int b; char c; }) на x86-64 без pack?",
"a": "12 (паддинг до выравнивания)",
"accept": [
"12",
"12 байт"
]
},
{
"domain": "c_cpp",
"q": "Что такое UB?",
"a": "undefined behavior: стандарт не накладывает требований",
"accept": [
"undefined behavior",
"неопределённое поведение",
"неопределенное поведение"
]
},
{
"domain": "c_cpp",
"q": "Что делает std::move сам по себе?",
"a": "static_cast к rvalue-ссылке; перемещение делает конструктор/присваивание",
"accept": [
"static_cast к rvalue",
"ничего, это каст",
"это каст к rvalue"
]
},
{
"domain": "c_cpp",
"q": "Чем new отличается от malloc?",
"a": "new вызывает конструктор и возвращает типизированный указатель",
"accept": [
"вызывает конструктор",
"конструктор",
"конструктор + типизированный указатель"
]
},
{
"domain": "c_cpp",
"q": "Класс владеет ресурсом и имеет деструктор, копирование не объявлено. Что будет?",
"a": "сгенерируется поверхностное копирование — двойное освобождение",
"accept": [
"двойное освобождение",
"двойное free",
"поверхностное копирование"
]
},
{
"domain": "c_cpp",
"q": "Зачем нужен виртуальный деструктор у базового класса?",
"a": "иначе delete через Base* — UB, деструктор наследника не вызовется",
"accept": [
"деструктор наследника не вызовется",
"иначе ub",
"чтобы вызвался деструктор наследника"
]
},
{
"domain": "c_cpp",
"q": "Что делает const после сигнатуры метода?",
"a": "делает this const, запрещает менять поля",
"accept": [
"this const",
"запрещает менять поля",
"метод не меняет объект"
]
},
{
"domain": "c_cpp",
"q": "Определён ли стандартом порядок вычисления аргументов f(a(), b())?",
"a": "нет, порядок не задан",
"accept": [
"нет",
"не определён",
"не задан",
"неопределён"
]
},
{
"domain": "c_cpp",
"q": "Что проверяет ASAN?",
"a": "выходы за границы, use-after-free, утечки",
"accept": [
"выходы за границы",
"use-after-free",
"память: границы и use-after-free"
]
},
{
"domain": "c_cpp",
"q": "Что проверяет UBSAN?",
"a": "неопределённое поведение: overflow, сдвиги, выравнивание",
"accept": [
"undefined behavior",
"неопределённое поведение",
"overflow"
]
},
{
"domain": "c_cpp",
"q": "Правило трёх/пяти — в чём суть?",
"a": "владеющий ресурсом класс задаёт деструктор, копирование и перемещение",
"accept": [
"деструктор + копирование + перемещение",
"деструктор, копирование, перемещение",
"нужно определить деструктор и копирование/перемещение"
]
},
{
"domain": "c_cpp",
"q": "Чем unique_ptr отличается от shared_ptr?",
"a": "unique_ptr — единственный владелец без счётчика; shared_ptr считает ссылки",
"accept": [
"единственный владелец",
"нет счётчика ссылок",
"счётчик ссылок у shared_ptr"
]
}
]
}