План v2 по диагностике (квиз 14/32) + 4 новые задачи (hash, heap, dijkstra, subnet) + тренажёр 60 карточек
This commit is contained in:
+591
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user