Я рассматриваю автоматизированные задания для вводного курса по алгоритмам и структурам данных. Студенты присылают код, я запускаю на них буст-тесты, количество пройденных тестов дает оценку, легко. Но я хочу оценить алгоритмы сортировки, например «Реализовать сортировку пузырьком, вставкой, выбором и слиянием». Есть ли умный способ проверить реализации каждого, чтобы узнать, что они действительно реализовали запрошенный алгоритм?
Очевидно, я могу проверить, что они отсортировали входные данные. Но то, что я действительно хочу, это нечто лучшее, чем просто сравнение таймингов для различных входных данных, чтобы проверить сложности.
Добро пожаловать на stackoverflow.com. Пожалуйста, найдите время, чтобы прочитать страницы справки, особенно разделы с названиями «На какие темы я могу здесь спросить?» и «Каких вопросов мне следует избегать?». Также возьмите тур и прочитайте о хороших вопросах Как спросить. Наконец, прочитайте контрольный список этого вопроса.
Что-то более точное. Автоматическое подтверждение того, что они реализовали именно то, что требуется.
Это похоже на человеческое сознание, которое трудно автоматизировать. По крайней мере, если вы будете следовать описанию алгоритма во время реализации, вы почти не испортите сложность (может быть, просто на O(1), что не имеет значения)
@AlexeyLarionov: Я думаю, что это на самом деле довольно определенный вопрос, дающий довольно определенный критерий того, что является или не является ответом. (Например, см. мой ответ ниже). Не каждый вопрос будет в духе «дайте мне пошаговые инструкции, как сделать кнопку в Qt другого цвета», и это не только приемлемо, но, я бы сказал, желательно.
Я не уверен, что автоматические задания учат чему-то, кроме «как погуглить известный алгоритм + язык». Я бы предпочел, чтобы студенты объяснить, почему правильно сортировали любой ввод.
@Caleth: Зависит от того, является ли цель «заставить учащихся доказать вам, что они понимают, как выполнять задание», или «позволить учащимся проверить свое понимание задания».
Не волнуйтесь, мы будем искать их, чтобы доказать свое понимание! Педагогика, стоящая за этим (как часть более широкой программы), здравая. Я бы сказал, что это также неплохо, если людям предоставляется возможность попрактиковаться в получении сегментов из Интернета для работы.





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: Да, прямое сравнение, подобное приведенному выше, не сработает для вещей, которые на самом деле представляют собой скорее «семейство» алгоритмов. Возможно, для инструктора класса алгоритмов допустимо написать алгоритм, который может определить, может ли список сравнений возникнуть в результате быстрой сортировки или нет.
Ты такой расплывчатый. «Хочу чего-нибудь получше» - вы не сказали, что хотите