Профилирование stable_sort

Эта страница говорит, что всякий раз, когда не хватает памяти, stable_sort сводится к алгоритму на месте с временем выполнения O(n(log n)(log n)):

сложность

Если доступно достаточное количество дополнительной памяти, то линеарифмическое по расстоянию между первым и последним: выполняет до N * log 2 (N) сравнений элементов (где N - это расстояние) и до этого количества перемещений элементов. В противном случае, полилолинейно на этом расстоянии: Выполняется до N * log 2 2 (N) сравнений элементов и до такого количества обменов элементов.

Я хочу профилировать его для другого алгоритма на месте с тем же временем выполнения, поэтому мой вопрос сводится к следующему: как я могу имитировать "нехватку памяти", чтобы более медленный алгоритм выполнялся в stable_sort?

1 ответ

Решение

cplusplus.com общеизвестно плох... глядя на описание cppreference.com здесь

Эта функция пытается выделить временный буфер, равный по размеру последовательности, которая должна быть отсортирована, обычно вызывая std::get_teilitary_buffer. Если распределение не удается, выбирается менее эффективный алгоритм.

get_temporary_buffer является:

template< class T >
std::pair< T*, std::ptrdiff_t > get_temporary_buffer( std::ptrdiff_t count )

Таким образом, в то время как это технически будет недостаточно определенным поведением, специализировать его для своего собственного класса в std namespace, вы, вероятно, не делаете этого для производственного кода, и на практике это очень вероятно, будет работать надежно и позволит вам перехватить запрос памяти и вернуть ошибку.

namespace std
{
    template <>
    std::pair<My_Class*, std::ptrdiff_t>
    get_temporary_buffer(std::ptrdiff_t)
    { return {0, 0}; }
}
Другие вопросы по тегам