ДЛЯ НОВИЧКОВНЕ ДЛЯ НОВИЧКОВНЕ ОБЯЗАТЕЛЬНОВ РАЗРАБОТКЕ
Разработчику
Архитектору
Инженеру
Чек-лист самопроверки
- Вы понимаете разницу между статическим и динамическим массивом по способу выделения памяти и поведению при изменении размера.
- Вы знаете, почему доступ к элементу массива по индексу выполняется за O(1).
- Вы можете объяснить, как происходит реаллокация в динамическом массиве и почему амортизированная сложность добавления в конец — O(1).
- Вы понимаете, когда целесообразно использовать разрежённый массив вместо плотного.
- Вы различаете зигзагообразный (jagged) и прямоугольный многомерный массив по структуре памяти и производительности.
- Вы знаете, почему односвязный список неэффективен для произвольного доступа по индексу.
- Вы понимаете, как двусвязный список позволяет обходить структуру в обоих направлениях.
- Вы можете привести пример применения циклического списка в системном программировании.
- Вы знаете, какие операции стек поддерживает и какова их временная сложность.
- Вы понимаете разницу между реализацией стека на массиве и на связном списке по потреблению памяти и предсказуемости задержек.
- Вы знаете, почему в real-time системах часто используют стек фиксированного размера.
- Вы понимаете принцип работы кольцевого буфера и как он реализует очередь без сдвига элементов.
- Вы можете объяснить, почему очередь на основе двух стеков имеет амортизированную сложность O(1) на операцию.
- Вы знаете, как дек (двусторонняя очередь) обобщает стек и очередь.
- Вы понимаете, как хеш-функция преобразует ключ в индекс корзины.
- Вы знаете два основных метода разрешения коллизий в хеш-таблицах и их компромиссы.
- Вы понимаете, почему Java 8+ преобразует длинные цепочки в красно-чёрные деревья.
- Вы знаете, что такое универсальное хеширование и зачем оно нужно для защиты от DoS-атак.
- Вы можете назвать свойства хорошей хеш-функции: скорость, равномерность, лавинный эффект.
- Вы понимаете, как бинарная куча представляет почти полное двоичное дерево в виде массива.
- Вы знаете, как вычисляются индексы потомков и родителя в массивном представлении кучи.
- Вы понимаете разницу между операциями
sift-up и sift-down и когда каждая из них применяется.
- Вы знаете, почему построение кучи из неупорядоченного массива можно выполнить за O(n), а не O(n log n).
- Вы понимаете, как d-арные кучи уменьшают высоту дерева и когда это выгодно.
- Вы знаете, почему стандартная бинарная куча не поддерживает эффективное обновление приоритета существующего элемента.
- Вы понимаете, как AVL-дерево поддерживает строгую сбалансированность через баланс-фактор и вращения.
- Вы знаете, почему красно-чёрные деревья делают меньше вращений при модификациях по сравнению с AVL.
- Вы понимаете, как B⁺-дерево оптимизирует диапазонные запросы за счёт связанных листьев.
- Вы знаете, почему B-деревья используются в СУБД, а не бинарные деревья поиска.
- Вы понимаете, как размер узла B-дерева соотносится с размером страницы файловой системы.
- Вы знаете, чем суффиксный массив отличается от суффиксного дерева по потреблению памяти и времени построения.
- Вы понимаете, как LCP-массив ускоряет поиск подстрок в суффиксном массиве.
- Вы знаете, почему CSR-формат эффективен для разрежённых графов в high-performance computing.
- Вы понимаете, как property graph в Neo4j отличается от математического графа наличием свойств и типов рёбер.
- Вы знаете, как native graph storage в Neo4j обеспечивает быстрый обход соседей без полного сканирования.
- Вы понимаете принцип работы фильтра Блума и почему он допускает ложноположительные, но не ложноотрицательные срабатывания.
- Вы знаете, как Count-Min Sketch оценивает частоту элементов и почему оценка всегда завышена.
- Вы понимаете, как HyperLogLog оценивает количество уникальных элементов с фиксированным объёмом памяти.
- Вы знаете, почему Cuckoo Filter поддерживает удаление, а классический фильтр Блума — нет.
- Вы понимаете, как красно-чёрное дерево используется в планировщике задач Linux CFS.
- Вы знаете, почему B⁺-деревья применяются в кластеризованных индексах InnoDB.
- Вы понимаете, как LSM-деревья оптимизируют запись за счёт фонового слияния SSTable’ов.
- Вы знаете, как .NET
Dictionary<TKey, TValue> использует открытую адресацию с двойным хешированием.
- Вы понимаете, как JVM
HashMap переключается с цепочек на красно-чёрные деревья при длине корзины > 8.
- Вы знаете, как V8 оптимизирует массивы, переключаясь между fast elements и dictionary mode.
- Вы понимаете, как карта памяти ядра Linux использует radix-дерево для управления VMA.
- Вы знаете, как slab allocator использует связные списки и битовые карты для выделения объектов фиксированного размера.
- Вы понимаете, как card table в generational GC помечает «грязные» регионы памяти при записи.
- Вы знаете, как HNSW и IVF индексы ускоряют поиск ближайших соседей в векторных базах данных.
- Вы понимаете, как выбор структуры данных влияет не только на алгоритмическую сложность, но и на кэш-локальность, предсказуемость задержек и масштабируемость в распределённых системах.