Детали реализации тестирования для автоматизированной оценки алгоритмов сортировки

Я рассматриваю автоматизированные задания для вводного курса по алгоритмам и структурам данных. Студенты присылают код, я запускаю на них буст-тесты, количество пройденных тестов дает оценку, легко. Но я хочу оценить алгоритмы сортировки, например «Реализовать сортировку пузырьком, вставкой, выбором и слиянием». Есть ли умный способ проверить реализации каждого, чтобы узнать, что они действительно реализовали запрошенный алгоритм?

Очевидно, я могу проверить, что они отсортировали входные данные. Но то, что я действительно хочу, это нечто лучшее, чем просто сравнение таймингов для различных входных данных, чтобы проверить сложности.

Ты такой расплывчатый. «Хочу чего-нибудь получше» - вы не сказали, что хотите

Alexey Larionov 09.05.2022 17:10

Добро пожаловать на stackoverflow.com. Пожалуйста, найдите время, чтобы прочитать страницы справки, особенно разделы с названиями «На какие темы я могу здесь спросить?» и «Каких вопросов мне следует избегать?». Также возьмите тур и прочитайте о хороших вопросах Как спросить. Наконец, прочитайте контрольный список этого вопроса.

Some programmer dude 09.05.2022 17:13

Что-то более точное. Автоматическое подтверждение того, что они реализовали именно то, что требуется.

William Kavanagh 09.05.2022 17:15

Это похоже на человеческое сознание, которое трудно автоматизировать. По крайней мере, если вы будете следовать описанию алгоритма во время реализации, вы почти не испортите сложность (может быть, просто на O(1), что не имеет значения)

Alexey Larionov 09.05.2022 17:18

@AlexeyLarionov: Я думаю, что это на самом деле довольно определенный вопрос, дающий довольно определенный критерий того, что является или не является ответом. (Например, см. мой ответ ниже). Не каждый вопрос будет в духе «дайте мне пошаговые инструкции, как сделать кнопку в Qt другого цвета», и это не только приемлемо, но, я бы сказал, желательно.

Daniel McLaury 09.05.2022 17:49

Я не уверен, что автоматические задания учат чему-то, кроме «как погуглить известный алгоритм + язык». Я бы предпочел, чтобы студенты объяснить, почему правильно сортировали любой ввод.

Caleth 09.05.2022 17:59

@Caleth: Зависит от того, является ли цель «заставить учащихся доказать вам, что они понимают, как выполнять задание», или «позволить учащимся проверить свое понимание задания».

Daniel McLaury 09.05.2022 18:01

Не волнуйтесь, мы будем искать их, чтобы доказать свое понимание! Педагогика, стоящая за этим (как часть более широкой программы), здравая. Я бы сказал, что это также неплохо, если людям предоставляется возможность попрактиковаться в получении сегментов из Интернета для работы.

William Kavanagh 09.05.2022 18:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Is there a clever way to test the implementations of each to know they did in fact implement the algorithm requested?

Заставьте их написать общую сортировку, которая сортирует (скажем) std::vector<T>, а затем в вашем модульном тесте предоставьте класс, в котором вы перегружаете оператор сравнения, используемый алгоритмом сортировки, чтобы регистрировать, какие объекты он сортирует. В конце ваш тест может изучить этот журнал и определить, были ли правильные вещи сравнены друг с другом в правильном порядке.

Что отличает один алгоритм сортировки от другого, так это порядок, в котором сравниваются элементы.

РЕДАКТИРОВАТЬ: Вот пример реализации. Не самая чистая или красивая вещь в мире, но достаточная как одноразовый класс, используемый в модульном тесте.

struct S
{
  static std::vector<std::pair<int, int>> * comparisonLog;

  int x;

  S(int t_x) : x(t_x) { }

  bool operator <(const S & t_other) const
  {
      comparisonLog->push_back({x, t_other.x});
      
      return x < t_other.x;
  }
};

std::vector<std::pair<int, int>> * S::comparisonLog;

Пример использования в модульном тесте:

    std::vector<std::pair<int, int>> referenceComparisons, studentComparisons;

    const std::vector<S> values = { 1, 5, 4, 3, 2 };

    S::comparisonLog = &referenceComparisons;
    {
      auto toSort = values;
      std::sort(toSort.begin(), toSort.end());
    }

    S::comparisonLog = &studentComparisons;
    {
        auto toSort = values;
        studentSort(toSort);
        assert(std::is_sorted(toSort.begin(), toSort.end()));
    }

    assert(referenceComparisons == studentComparisons);

Это проверяет, что studentSort реализует тот же алгоритм сортировки, что и std::sort. (Конечно, не проверяет, что studentSort не просто пересылает std::sort...)

ИЗМЕНИТЬ, ЧТОБЫ ДОБАВИТЬ: Альтернативой, которая может лучше обобщать вещи, отличные от конкретных алгоритмов сортировки, было бы заставить их написать общую сортировку, берущую начало и конец итераторов определенного типа и инструментирующую арифметику указателя и операторы разыменования для итераторов, которые вы им передаете.

Хотя мне это действительно нравится, вам нужно быть осторожным, допуская ряд разумных дизайнерских решений, например. выбор точки опоры для быстрой сортировки.

Caleth 09.05.2022 17:53

@Caleth: Да, прямое сравнение, подобное приведенному выше, не сработает для вещей, которые на самом деле представляют собой скорее «семейство» алгоритмов. Возможно, для инструктора класса алгоритмов допустимо написать алгоритм, который может определить, может ли список сравнений возникнуть в результате быстрой сортировки или нет.

Daniel McLaury 09.05.2022 17:59

Другие вопросы по теме