Карточки 149 (сложности структур и определения из уроков) + HR_BASE.md под тех-скрининг

This commit is contained in:
Kodlo-chan
2026-09-23 21:16:58 +07:00
parent 387f29d376
commit 51ca8c91b9
3 changed files with 944 additions and 1 deletions
+573 -1
View File
@@ -1,5 +1,5 @@
{
"version": 2,
"version": 3,
"note": "Уровни: base — база (начинать отсюда), core — то, что спросят, deep — нишевое. Поле ref — куда смотреть, why — пояснение.",
"facts": [
{
@@ -1265,6 +1265,578 @@
"level": "base",
"ref": "",
"why": "С -Werror предупреждения становятся ошибками — полезная привычка."
},
{
"domain": "algo",
"q": "Сложность доступа к элементу по индексу в массиве (vector)?",
"a": "O(1)",
"accept": [
"o(1)"
],
"level": "base",
"ref": "",
"why": "Массив лежит подряд: адрес считается арифметикой, без перебора."
},
{
"domain": "algo",
"q": "Сложность вставки в конец vector (push_back)?",
"a": "амортизированное O(1)",
"accept": [
"o(1)",
"амортизированное o(1)",
"амортизированно o(1)"
],
"level": "base",
"ref": "",
"why": "Обычно O(1); при переполнении массив копируется за O(n), но редко — в среднем O(1)."
},
{
"domain": "algo",
"q": "Сложность вставки или удаления в середине vector?",
"a": "O(n)",
"accept": [
"o(n)"
],
"level": "base",
"ref": "",
"why": "Надо сдвинуть все элементы после места вставки."
},
{
"domain": "algo",
"q": "Сложность поиска в неотсортированном массиве и в отсортированном?",
"a": "O(n) и O(log n)",
"accept": [
"o(n) и o(log n)",
"o(n) против o(log n)",
"o(n), o(log n)"
],
"level": "base",
"ref": "",
"why": "Отсортированность — то, за что платят O(n log n) при сортировке и получают O(log n) поиска."
},
{
"domain": "algo",
"q": "Сложность доступа к элементу связного списка по номеру?",
"a": "O(n)",
"accept": [
"o(n)"
],
"level": "base",
"ref": "",
"why": "К узлам нет произвольного доступа — только идти по указателям от начала."
},
{
"domain": "algo",
"q": "Сложность вставки и удаления в связном списке, если узел уже известен?",
"a": "O(1)",
"accept": [
"o(1)"
],
"level": "base",
"ref": "",
"why": "Меняются два указателя, сдвигать ничего не надо — в этом плюс списка."
},
{
"domain": "algo",
"q": "Сложность поиска в бинарном дереве поиска (BST)?",
"a": "O(log n) в среднем, O(n) в худшем",
"accept": [
"o(log n) в среднем o(n) в худшем",
"o(log n), o(n)",
"o(log n) в среднем"
],
"level": "base",
"ref": "",
"why": "Худший случай — вырожденное дерево в список; лечится балансировкой (AVL, красно-чёрное)."
},
{
"domain": "algo",
"q": "Что быстрее по памяти: vector или list?",
"a": "vector (нет указателей и отдельных аллокаций)",
"accept": [
"vector",
"вектор"
],
"level": "base",
"ref": "",
"why": "У list на каждый узел ещё два указателя и аллокация; зато вставка в середину дешевле."
},
{
"domain": "algo",
"q": "Сложность поиска, вставки и удаления в std::map?",
"a": "O(log n)",
"accept": [
"o(log n)"
],
"level": "base",
"ref": "",
"why": "Красно-чёрное дерево: операции логарифмические и порядок ключей сохраняется."
},
{
"domain": "algo",
"q": "Сложность тех же операций в std::unordered_map?",
"a": "O(1) в среднем, O(n) в худшем",
"accept": [
"o(1) в среднем",
"o(1) в среднем o(n) в худшем"
],
"level": "base",
"ref": "",
"why": "Хеш-таблица: порядок не сохраняется, зато быстрее в среднем."
},
{
"domain": "algo",
"q": "Сложность поиска в std::set и std::unordered_set?",
"a": "O(log n) и O(1) в среднем",
"accept": [
"o(log n) и o(1)",
"o(log n), o(1) в среднем"
],
"level": "base",
"ref": "",
"why": "set — дерево, unordered_set — хеш-таблица."
},
{
"domain": "algo",
"q": "Что такое in-place сортировка и пример?",
"a": "сортировка без дополнительной памяти O(1), например heapsort",
"accept": [
"без дополнительной памяти",
"сортировка на месте"
],
"level": "base",
"ref": "",
"why": "quicksort тоже in-place, но у него O(log n) на стек рекурсии."
},
{
"domain": "algo",
"q": "Какие операции у стека и очереди и их сложность?",
"a": "push/pop за O(1), доступ только к одному концу",
"accept": [
"push pop o(1)",
"o(1) на push и pop"
],
"level": "base",
"ref": "",
"why": "Стек — LIFO, очередь — FIFO; произвольного доступа нет."
},
{
"domain": "algo",
"q": "Сложность доступа к элементу std::deque по индексу?",
"a": "O(1)",
"accept": [
"o(1)"
],
"level": "base",
"ref": "",
"why": "deque — массив блоков фиксированного размера, индекс считается арифметикой."
},
{
"domain": "algo",
"q": "Что такое структура данных?",
"a": "способ организации данных, определяющий доступ и сложность операций",
"accept": [
"способ организации данных",
"организация данных для эффективного доступа"
],
"level": "base",
"ref": "",
"why": "Массив, список, хеш-таблица, дерево, куча — разные компромиссы время/память."
},
{
"domain": "algo",
"q": "Что такое алгоритм?",
"a": "конечная последовательность шагов, превращающая вход в выход",
"accept": [
"последовательность шагов",
"конечная последовательность действий"
],
"level": "base",
"ref": "",
"why": "Оценивается по времени и памяти, чаще всего через O-нотацию."
},
{
"domain": "algo",
"q": "Что такое рекурсия и её цена?",
"a": "функция вызывает себя; цена — стек вызовов O(глубины)",
"accept": [
"функция вызывает себя",
"самовызов функции"
],
"level": "base",
"ref": "",
"why": "Глубина важна: на 10⁵ уровнях стек переполняется, нужна итерация."
},
{
"domain": "algo",
"q": "Что такое жадный алгоритм?",
"a": "на каждом шаге берём локально лучшее решение",
"accept": [
"локально лучшее на каждом шаге",
"выбор лучшего на каждом шаге"
],
"level": "base",
"ref": "",
"why": "Работает не всегда: пример — размен монет; для интервального расписания работает."
},
{
"domain": "algo",
"q": "Что такое динамическое программирование?",
"a": "разбиение задачи на подзадачи с сохранением результатов",
"accept": [
"разбиение на подзадачи с запоминанием",
"запоминание результатов подзадач"
],
"level": "base",
"ref": "",
"why": "Отличие от рекурсии — мемоизация: каждая подзадача считается один раз."
},
{
"domain": "algo",
"q": "Что такое граф, вершина и ребро?",
"a": "набор вершин и связей между ними",
"accept": [
"вершины и рёбра",
"набор вершин и связей"
],
"level": "base",
"ref": "",
"why": "Дерево — это связный граф без циклов на n вершинах с n−1 рёбрами."
},
{
"domain": "algo",
"q": "Что такое DAG?",
"a": "ориентированный ациклический граф",
"accept": [
"ориентированный ациклический граф",
"направленный без циклов"
],
"level": "base",
"ref": "",
"why": "Только на DAG возможна топологическая сортировка — порядок зависимостей."
},
{
"domain": "algo",
"q": "Что такое связный компонент графа?",
"a": "максимальный набор вершин, достижимых друг из друга",
"accept": [
"набор вершин достижимых друг из друга",
"максимальная связная часть графа"
],
"level": "base",
"ref": "",
"why": "Число компонент ищется обходом BFS/DFS или union-find."
},
{
"domain": "linux",
"q": "Что такое поток (thread) и чем отличается от процесса?",
"a": "единица выполнения внутри процесса; общая память, свой стек",
"accept": [
"единица выполнения внутри процесса",
"общая память но свой стек"
],
"level": "base",
"ref": "",
"why": "Потоки дешевле по переключению, но требуют синхронизации общей памяти."
},
{
"domain": "linux",
"q": "Что такое виртуальная память?",
"a": "каждому процессу — своё адресное пространство, страницы отображаются на физическую память",
"accept": [
"своё адресное пространство",
"адреса процессов транслируются в физические"
],
"level": "base",
"ref": "",
"why": "Изоляция процессов и возможность swap — следствие виртуальной памяти."
},
{
"domain": "linux",
"q": "Что такое страница памяти?",
"a": "блок памяти фиксированного размера (обычно 4 КБ)",
"accept": [
"блок фиксированного размера",
"4 кб"
],
"level": "base",
"ref": "",
"why": "Страницами оперируют ядро, mmap, copy-on-write и swap."
},
{
"domain": "linux",
"q": "Что такое планировщик и контекст-свитч?",
"a": "компонент ядра, решающий кто исполняется; переключение потоков",
"accept": [
"переключение между задачами",
"ядро выбирает кому исполняться"
],
"level": "base",
"ref": "",
"why": "Свитч — дорого: сохранить регистры и стек, поэтому меньше потоков ≠ хуже."
},
{
"domain": "linux",
"q": "Что такое мьютекс и что такое гонка данных?",
"a": "мьютекс — блокировка на одного владельца; гонка — несинхронизированный доступ",
"accept": [
"блокировка и несинхронизированный доступ",
"мьютекс блокировка, гонка одновременный доступ"
],
"level": "base",
"ref": "",
"why": "Гонки ловит ThreadSanitizer, взаимные блокировки — анализ порядка захвата."
},
{
"domain": "linux",
"q": "Что такое дедлок?",
"a": "взаимная блокировка: потоки ждут ресурсы друг друга",
"accept": [
"взаимная блокировка",
"потоки ждут друг друга вечно"
],
"level": "base",
"ref": "",
"why": "Четыре условия Коффмана; профилактика — единый порядок захвата мьютексов."
},
{
"domain": "linux",
"q": "Что такое семафор?",
"a": "счётчик, разрешающий доступ N потокам",
"accept": [
"счётчик доступа",
"разрешение N потокам"
],
"level": "base",
"ref": "",
"why": "Мьютекс — частный случай семафора с единицей."
},
{
"domain": "net",
"q": "Что такое инкапсуляция в сетях?",
"a": "каждый уровень добавляет свой заголовок к данным верхнего",
"accept": [
"добавление заголовка уровнем",
"заголовок уровня добавляется к данным"
],
"level": "base",
"ref": "",
"why": "Поэтому кадр = Ethernet-заголовок + IP + TCP + данные."
},
{
"domain": "net",
"q": "Что такое кадр (frame) и пакет (packet)?",
"a": "кадр — единица L2, пакет — единица L3",
"accept": [
"кадр l2 пакет l3",
"кадр на канальном пакет на сетевом"
],
"level": "base",
"ref": "",
"why": "Пакет едет внутри кадра; на каждом узле кадр пересобирается заново."
},
{
"domain": "net",
"q": "Что такое CIDR-запись /24?",
"a": "24 бита на сеть, 8 на узлы: 256 адресов",
"accept": [
"24 бита сети",
"256 адресов 24 бита сети"
],
"level": "base",
"ref": "",
"why": "Чем больше префикс, тем меньше подсеть: /30 — 4 адреса, /26 — 64."
},
{
"domain": "net",
"q": "Что такое широковещательный адрес?",
"a": "все единицы в хостовой части — адрес всех узлов подсети",
"accept": [
"все единицы в хостовой части",
"адрес всех узлов подсети"
],
"level": "base",
"ref": "",
"why": "Поэтому в /24 последний адрес (.255) — broadcast, он не узел."
},
{
"domain": "net",
"q": "Что такое время жизни (TTL) и зачем он?",
"a": "счётчик переходов в IPv4, уменьшается на каждом маршрутизаторе",
"accept": [
"счётчик переходов",
"уменьшается на каждом маршрутизаторе"
],
"level": "base",
"ref": "",
"why": "Защита от вечных петель; traceroute использует истечение TTL."
},
{
"domain": "c_cpp",
"q": "Что такое объект и класс?",
"a": "класс — описание, объект — экземпляр в памяти",
"accept": [
"класс описание объект экземпляр",
"класс это описание, объект это экземпляр"
],
"level": "base",
"ref": "",
"why": "Класс не занимает память, объект занимает."
},
{
"domain": "c_cpp",
"q": "Три кита ООП?",
"a": "инкапсуляция, наследование, полиморфизм",
"accept": [
"инкапсуляция наследование полиморфизм"
],
"level": "base",
"ref": "",
"why": "Инкапсуляция — скрыть состояние, наследование — переиспользовать, полиморфизм — один интерфейс, разные реализации."
},
{
"domain": "c_cpp",
"q": "Что такое инкапсуляция?",
"a": "сокрытие внутреннего состояния за публичным интерфейсом",
"accept": [
"сокрытие состояния за интерфейсом",
"скрытие внутреннего состояния"
],
"level": "base",
"ref": "",
"why": "В C++ — private/protected + методы доступа."
},
{
"domain": "c_cpp",
"q": "Что такое полиморфизм в C++?",
"a": "вызов функции по фактическому типу объекта через virtual",
"accept": [
"virtual вызов по фактическому типу",
"вызов по фактическому типу"
],
"level": "base",
"ref": "",
"why": "Без virtual будет раннее связывание по типу указателя — классическая ловушка."
},
{
"domain": "c_cpp",
"q": "Что такое абстрактный класс?",
"a": "класс с чисто виртуальной функцией, экземпляр создать нельзя",
"accept": [
"с чисто виртуальной функцией",
"нельзя создать экземпляр"
],
"level": "base",
"ref": "",
"why": "В C++ нет отдельного `interface` — его роль играет класс из чисто виртуальных методов."
},
{
"domain": "c_cpp",
"q": "Чем перегрузка отличается от переопределения?",
"a": "перегрузка — разные параметры в одной области, переопределение — virtual в наследнике",
"accept": [
"перегрузка параметры, переопределение virtual",
"разные параметры против virtual"
],
"level": "base",
"ref": "",
"why": "Перегрузка решается на компиляции, переопределение — в рантайме."
},
{
"domain": "c_cpp",
"q": "Что такое static-член класса?",
"a": "общий для всех объектов, живёт вне объекта",
"accept": [
"общий для всех объектов",
"принадлежит классу а не объекту"
],
"level": "base",
"ref": "",
"why": "У static-метода нет this, поэтому он не может быть const."
},
{
"domain": "c_cpp",
"q": "Что такое шаблон и зачем он?",
"a": "обобщённый код, тип подставляется при компиляции",
"accept": [
"обобщённый код",
"код обобщённый по типу"
],
"level": "base",
"ref": "",
"why": "Так устроены контейнеры STL: код один, тип разный, цена — ошибки на компиляции."
},
{
"domain": "c_cpp",
"q": "Что такое виртуальная таблица (vtable)?",
"a": "таблица указателей на виртуальные функции объекта",
"accept": [
"таблица указателей на виртуальные функции",
"таблица виртуальных методов"
],
"level": "base",
"ref": "",
"why": "Отсюда +8 байт на объект и невозможность virtual в конструкторе."
},
{
"domain": "c_cpp",
"q": "Что такое header guard / #pragma once?",
"a": "защита от повторного включения заголовка",
"accept": [
"защита от повторного включения",
"защита от двойного включения"
],
"level": "base",
"ref": "",
"why": "Без неё повторное определение типа — ошибка компиляции."
},
{
"domain": "c_cpp",
"q": "Что делает линковщик?",
"a": "собирает объектные файлы в один исполняемый, разрешает внешние символы",
"accept": [
"собирает объектные файлы",
"разрешает внешние символы"
],
"level": "base",
"ref": "",
"why": "«undefined reference» — ошибка линковщика, а не компилятора."
},
{
"domain": "c_cpp",
"q": "Что такое std::vector внутри?",
"a": "динамический массив с удвоением ёмкости",
"accept": [
"динамический массив",
"динамический массив с удвоением"
],
"level": "base",
"ref": "",
"why": "Отсюда амортизированное O(1) на push_back и invalidate итераторов при росте."
},
{
"domain": "c_cpp",
"q": "Чем emplace_back лучше push_back?",
"a": "строит объект на месте, без копирования/перемещения",
"accept": [
"строит на месте",
"конструирует на месте без копии"
],
"level": "base",
"ref": "",
"why": "Разница видна на тяжёлых объектах и типах без копирования."
},
{
"domain": "c_cpp",
"q": "Что делает reserve и зачем?",
"a": "резервирует ёмкость, убирая реаллокации",
"accept": [
"резервирует ёмкость",
"выделяет память заранее"
],
"level": "base",
"ref": "",
"why": "Когда размер известен, reserve — дешёвая оптимизация."
}
]
}