⚙️ Алгоритмы  ·  20 вопросов  ·  ~45 мин  ·  ⏱ Таймер 45:00  ·  Сложный  ·  👥 1 прошёл

Выбор алгоритма для задачи

Финальный тест не спрашивает, какой алгоритм «самый быстрый». Нужно сначала распознать структуру задачи, перевести ограничения в допустимую сложность, выбрать структуру данных и затем доказать или проверить решение. Кейсы охватывают запросы, потоки, графы, подмножества, окна и автоматическое сравнение с эталоном.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выбери один ответ из четырёх. В тесте 20 вопросов и 45 минут. После завершения откроются общий процент, четыре тематические шкалы, правильные ответы и пояснения.
Вопрос 1 из 20
Какой метод лучше всего соответствует задаче?
Python
def answer_queries(sorted_values, queries):
    result = []
    for x in queries:
        result.append(count_elements_less_than(sorted_values, x))
    return result

# len(sorted_values) = 200_000
# len(queries) = 100_000
Вопрос 2 из 20
Что является главным сигналом для скользящего окна?
Python
def longest_segment(a, limit):
    best = 0
    for left in range(len(a)):
        total = 0
        for right in range(left, len(a)):
            total += a[right]
            if total <= limit:
                best = max(best, right - left + 1)
    return best

# Все элементы a положительны.
Вопрос 3 из 20
В условии требуется выбрать произвольное подмножество элементов, а не непрерывный отрезок. Как это влияет на выбор скользящего окна?
Вопрос 4 из 20
Какой алгоритм распознаётся по условию?
Python
graph = {
    'сборка': ['тесты'],
    'тесты': ['публикация'],
    'документация': ['публикация'],
    'публикация': [],
}

# Нужно получить порядок, в котором каждая вершина
# расположена после всех входящих в неё зависимостей.
Вопрос 5 из 20
Какая деталь превращает задачу «найти пару с суммой S» из общего случая в решение двумя указателями?
Вопрос 6 из 20
Какой подход пройдёт при n=200000 для поиска числа инверсий?
O(n\log n)
Python
def count_inversions(a):
    count = 0
    for i in range(len(a)):
        for j in range(i + 1, len(a)):
            if a[i] > a[j]:
                count += 1
    return count

n = 200_000
Вопрос 7 из 20
Какой объём памяти неприемлем при V=100000 и E=200000?
Python
V = 100_000
E = 200_000

matrix_cells = V * V
adjacency_entries = 2 * E
visited_entries = V
queue_capacity = V

print(matrix_cells, adjacency_entries,
      visited_entries, queue_capacity)
# Нужно выбрать представление, которое не помещается в разумную память.
Вопрос 8 из 20
n≤22, нужно найти лучший результат среди всех подмножеств. Какой метод ещё может быть реалистичен?
2^{22}=4{,}194{,}304
Вопрос 9 из 20
Что выбрать при миллионе запросов минимума на неизменном массиве?
Python
def answer_queries(a, queries):
    answers = []
    for left, right in queries:
        answers.append(min(a[left:right + 1]))
    return answers

# a не меняется, запросов около 1_000_000.
Вопрос 10 из 20
Почему оценка O(n) не гарантирует, что решение пройдёт при n=10^8?
Вопрос 11 из 20
Что выбрать для потока событий, где нужно постоянно получать событие с ближайшим временем?
Python
events = []

def add_event(timestamp, payload):
    events.append((timestamp, payload))

def take_nearest():
    index = min(range(len(events)), key=lambda i: events[i][0])
    return events.pop(index)

# Обе операции выполняются постоянно.
Вопрос 12 из 20
Какая структура нужна для максимумов всех окон длины k за O(n)?
Python
def window_maximums(a, k):
    result = []
    for left in range(len(a) - k + 1):
        result.append(max(a[left:left + k]))
    return result

# Нужно снизить суммарную сложность до O(n).
Вопрос 13 из 20
Нужно поддерживать ключи в порядке и отвечать на запрос «первый ключ ≥x» после вставок. Что подходит?
Вопрос 14 из 20
Чем заменить удаление pop(0) из большого списка в очереди?
Python
while items:
    x = items.pop(0)
    process(x)
Вопрос 15 из 20
Для частых проверок принадлежности и удаления дублей, порядок не нужен. Что выбрать?
Вопрос 16 из 20
Как лучше проверить быстрый алгоритм на малых входах?
Python
for case in random_small_cases():
    fast = solve_fast(case)
    slow = solve_bruteforce(case)
    assert fast == slow
Вопрос 17 из 20
Какой тест выявит ошибку best=0 в поиске максимума?
Python
def maximum(a):
    best = 0
    for x in a:
        best = max(best, x)
    return best
Вопрос 18 из 20
Цикл ищет максимум: best=a[0], затем перед каждой итерацией с индексом i обрабатывает элементы a[0]…a[i−1]. Какой инвариант точнее всего описывает best?
Вопрос 19 из 20
Какой контрпример ломает двоичный поиск по неотсортированному массиву?
Python
a = [10, 1, 7]
x = 10
# mid=1, a[mid]=1 < 10, поиск отбрасывает левую половину
Вопрос 20 из 20
Какой набор граничных случаев наиболее содержателен для нового алгоритма на массиве?
\{0,1,\text{повторы},\text{порядок},\text{обратный порядок},\text{границы}\}

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу