C C  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Алгоритмы и сложность в C

Тест связывает алгоритмическую идею с реальным кодом на C: проверяет границы двоичного поиска, контракт компараторов, локальность памяти, инварианты и защиту от переполнений и ресурсного истощения.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 6 темам.
Вопрос 1 из 30
Почему компаратор `return *(int*)a - *(int*)b;` ненадёжен?
CC17
int cmp(const void *a,const void *b){
  int x=*(const int*)a, y=*(const int*)b;
  return x-y;
}
Вопрос 2 из 30
Какое свойство сортировки важно, если записи уже упорядочены по вторичному ключу?
CСитуация
/* сначала сортировка по фамилии, затем по отделу */
stable_sort(records,n,by_department);
Вопрос 3 из 30
Функция `partition` возвращает окончательный индекс опорного элемента `p`, а границы `lo` и `hi` включены. Что неверно в рекурсивных вызовах?
CC17
size_t p = partition(a, lo, hi); /* p — окончательный индекс опорного элемента */
quick(a, lo, p);
quick(a, p, hi);
Вопрос 4 из 30
При последовательном обходе миллионов небольших структур какая организация данных обычно лучше использует кэш процессора?
Вопрос 5 из 30
Какой вызов передаёт `qsort` ровно `n` элементов массива `values` и правильный размер одного элемента?
CC17
int values[] = {7, 2, 9, 2};
size_t n = sizeof values / sizeof values[0];
/* Выберите корректный вызов qsort для массива values. */
Вопрос 6 из 30
Почему формула `mid=(lo+hi)/2` может быть опасна?
CC17
size_t lo = first;
size_t hi = last;
size_t mid = (lo + hi) / 2;
Вопрос 7 из 30
Какой инвариант соответствует поиску нижней границы в полуинтервале `[lo, hi)`?
Вопрос 8 из 30
Что происходит при вызове функции с `n == 0`?
CC17
size_t last(const int *a,size_t n,int key){
  size_t hi=n;
  if(a[hi-1]==key) return hi-1;
  return SIZE_MAX;
}
Вопрос 9 из 30
Когда `bsearch` имеет право дать бессмысленный результат, даже если компаратор корректен?
Вопрос 10 из 30
Как отличить «не найдено» от корректного индекса 0, если функция работает с `size_t`?
CC17
bool find(const int *a,size_t n,int key,size_t *pos);
Вопрос 11 из 30
Как корректно сравнить два `uint64_t` для qsort?
CC17
static int cmp_u64(const void *pa, const void *pb) {
    uint64_t x = *(const uint64_t *)pa;
    uint64_t y = *(const uint64_t *)pb;
    /* Выберите безопасное выражение return. */
}
Вопрос 12 из 30
Почему `memcmp` не подходит как общий числовой компаратор значений `int`?
CC17
return memcmp(a,b,sizeof(int));
Вопрос 13 из 30
Компаратор иногда возвращает 1 и для a<b, и для a>b. Что нарушено?
Вопрос 14 из 30
Как поступить с NaN при сортировке double, если нужен воспроизводимый полный порядок?
CC17
if(isnan(x)) return isnan(y)?0:1;
if(isnan(y)) return -1;
Вопрос 15 из 30
Какой дефект у компаратора строк?
CC17
int cmp(const void *a,const void *b){
  return strcmp((const char*)a,(const char*)b);
}
Вопрос 16 из 30
Почему список может проиграть массиву даже при одинаковой O(n) сложности обхода?
Вопрос 17 из 30
Какой риск создаёт `realloc` ровно на один новый элемент в каждой итерации?
CC17
for (size_t i = 0; i < n; ++i) {
    /* (i + 1) * sizeof *a заранее проверено на переполнение */
    int *tmp = realloc(a, (i + 1) * sizeof *a);
    if (tmp == NULL) {
        handle_allocation_error();
        break;
    }
    a = tmp;
}
Вопрос 18 из 30
Что измерять при выборе между двумя реализациями хеш-таблицы?
Вопрос 19 из 30
Какое изменение снижает число выделений при сортировке строковых записей?
Вопрос 20 из 30
Почему микроизмерение на массиве из 8 элементов не доказывает выбор алгоритма для миллиона?
CC17
bench(8);
/* По этому единственному измерению пытаются выбрать алгоритм для n ≈ 1 000 000. */
Вопрос 21 из 30
Какое свойство удобно проверять для любой сортировки?
CC17
assert(sorted(out,n));
assert(same_multiset(in,out,n));
Вопрос 22 из 30
Оптимизированный поиск иногда расходится с линейным на случайных малых массивах. Первый шаг?
Вопрос 23 из 30
Какой инвариант должен выполняться после шага разделения в быстрой сортировке?
Вопрос 24 из 30
Почему тесты только на случайных данных недостаточны?
Вопрос 25 из 30
Как локализовать первую операцию, нарушившую кучу?
CC17
#ifndef NDEBUG
assert(heap_ok(h));
#endif
Вопрос 26 из 30
Как безопасно проверить размер выделения `n * sizeof *a`?
CC17
if(n > SIZE_MAX/sizeof *a) return ERR_SIZE;
a=malloc(n*sizeof *a);
Вопрос 27 из 30
Недоверенный ввод задаёт n для алгоритма O(n²). Что важно сделать до запуска?
Вопрос 28 из 30
Почему выражение `for(size_t i=n-1;i>=0;i--)` опасно?
CC17
for (size_t i = n - 1; i >= 0; --i) {
    use(a[i]);
}
Вопрос 29 из 30
Что делать, если временный буфер сортировки выделить не удалось?
Вопрос 30 из 30
Почему глубина рекурсии quicksort на враждебном входе является вопросом безопасности?
CC17
if(depth > limit) heap_sort(a,n);

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

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

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

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