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

Разделяй и властвуй

Разделение задачи полезно лишь тогда, когда части действительно меньше, покрывают исходный вход и могут быть собраны без повторного решения всей задачи. Вопросы проверяют пропущенные границы, зацикленную рекурсию, слияние, подсчёт инверсий и оценки по дереву уровней.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выбери один ответ из четырёх. В тесте 20 вопросов и 45 минут. После завершения откроются общий процент, четыре тематические шкалы, правильные ответы и пояснения.
Вопрос 1 из 20
Какие части получатся для массива нечётной длины?
Python
a = [1, 2, 3, 4, 5, 6, 7]
mid = len(a) // 2
left = a[:mid]
right = a[mid:]
print(left, right)
Вопрос 2 из 20
Какой дефект в разбиении?
Python
mid = len(a) // 2
left = a[:mid]
right = a[mid + 1:]
Вопрос 3 из 20
Какая характеристика разбиения особенно важна для глубины быстрой сортировки?
Вопрос 4 из 20
Сколько подмассивов длины 1 получится в листьях?
Python
def split(n):
    if n <= 1:
        return 1
    left = n // 2
    right = n - left
    return split(left) + split(right)

print(split(13))
Вопрос 5 из 20
Когда подход «разделяй и властвуй» неприменим напрямую?
Вопрос 6 из 20
Какой максимум вернёт функция?
Python
def max_dc(a, left, right):
    if right - left == 1:
        return a[left]
    mid = (left + right) // 2
    return max(max_dc(a, left, mid),
               max_dc(a, mid, right))

print(max_dc([4, 9, 1, 7, 3], 0, 5))
Вопрос 7 из 20
Почему функция не завершится для массива длины 2?
Python
def solve(a):
    if len(a) == 1:
        return a[0]
    mid = len(a) // 2
    return solve(a[:mid]) + solve(a[mid - 1:])
Вопрос 8 из 20
Что должен обещать рекурсивный контракт merge_sort(a)?
Вопрос 9 из 20
Сколько раз будет вычислен solve(2)?
Python
calls = 0
def solve(n):
    global calls
    if n == 2:
        calls += 1
    if n <= 1:
        return 1
    return solve(n // 2) + solve(n - n // 2)

solve(8)
print(calls)
Вопрос 10 из 20
Почему вычислять одну и ту же подзадачу дважды внутри divide-and-conquer обычно нежелательно?
Вопрос 11 из 20
Какой список получится после слияния?
Python
a = [1, 5, 9]
b = [2, 3, 10]
i = j = 0
out = []
while i < len(a) and j < len(b):
    if a[i] < b[j]:
        out.append(a[i]); i += 1
    else:
        out.append(b[j]); j += 1
out += a[i:]
out += b[j:]
print(out)
Вопрос 12 из 20
Сколько пересечений между половинами добавится?
Python
left = [1, 4, 8]
right = [2, 3, 7]
i = j = 0
inversions = 0
while i < len(left) and j < len(right):
    if left[i] <= right[j]:
        i += 1
    else:
        inversions += len(left) - i
        j += 1
print(inversions)
Вопрос 13 из 20
Почему при слиянии двух отсортированных массивов достаточно сравнивать их первые ещё не взятые элементы?
Вопрос 14 из 20
Какой дефект даст потерю элементов?
Python
def merge(left, right):
    i = j = 0
    out = []
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            out.append(left[i])
            i += 1
        else:
            out.append(right[j])
            j += 1
    return out
Вопрос 15 из 20
Какова стоимость слияния массивов длины p и q?
T_{merge}=O(p+q)
Вопрос 16 из 20
Какова сложность функции?
Python
def solve(n):
    if n <= 1:
        return
    solve(n // 2)
    solve(n // 2)
    for _ in range(n):
        pass
Вопрос 17 из 20
Какова сложность при перекошенном разбиении?
T(n)=T(n-1)+O(n)
Python
def bad_sort(a):
    if len(a) <= 1:
        return a
    pivot = a[0]
    rest = bad_sort(a[1:])
    # вставка pivot в подходящее место за O(len(a))
    return insert_sorted(rest, pivot)
Вопрос 18 из 20
Какова сложность T(n)=T(n/2)+O(n)?
T(n)=T(n/2)+O(n)=O(n)
Вопрос 19 из 20
Что произойдёт с общей сложностью сортировки слиянием, если слияние каждой пары частей реализовать за O(n²) на уровне корня?
Python
n = 1024
levels = 0
while n > 1:
    n //= 2
    levels += 1
print(levels)
Вопрос 20 из 20
Что произойдёт с общей сложностью сортировка слиянием, если слияние каждой пары частей реализовать за O(n²) на уровне корня?

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

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

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

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