Карточки 149 (сложности структур и определения из уроков) + HR_BASE.md под тех-скрининг
This commit is contained in:
+573
-1
@@ -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 — дешёвая оптимизация."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user