Информация не достаточна. Вам также необходимо знать распределение значений M
через векторы N
. Если у вас есть что, то это прямо вперед, чтобы найти общую сложность:
std::sort
имеет сложность O(N·log(N))
сравнений.
std::vector
использует std::lexicographical_compare(v1, v2)
для сравнения, что имеет сложность в сравнении O(min(v1.size(), v2.size()))
.
int
сравнение имеет сложность O(1)
.
Дадим E(M, N)
функция на M
, N
, что возвращает значит количество минимальных элементов между каждой парой внутренних векторов.
- Например, если у вас есть равномерное распределение, это тривиальным равно
M/N
.
- Возьмите продукт:
Big Oh = N·log(N)·E(M, N)·1
.
- Для равномерное распределение, это будет
M·log(N)
.
Вы можете использовать Discrete Probability Distribution theory, чтобы выяснить, что функция E(M, N)
для любого распределения M
через N
.
Edit 1: Для того, чтобы управлять точкой как/почему это важно: Рассмотрим распределение, всегда делает мои векторы выглядеть следующим образом:
outer[0].size() == 1,
outer[1].size() == 1,
outer[2].size() == 1,
...,
outer[M-1].size() == (M - N + 1)
В этом случае, E(M, N) = 1
, потому что std::lexicographical_compare
будет иметь только один другой элемент для сравнения с любой парой элементов. Таким образом, для этого конкретного распределения я буду всегда имеют сложность O(N·log(N))
. Но с равномерным распределением у меня будет O(M·log(N))
.
Edit 2: После комментария вы задаете распределение, давайте попробуем найти E(M, N)
.
Во-первых, обратите внимание, что в общей сложности T = (N choose 2) = N(N - 1)(1/2)
различных комбинаций векторных сравнений.
Одна (и только одна) комбинация будет принимать X = O((M - N + 2)(1/2))
сравнения и имеет вероятность P(X) = 1/T
.
Для сравнения любая другая комбинация требует только 1
сравнения (O(1)
), и поэтому эти случаи происходят с вероятностью P(1) = (T - 1)/T
.
Найти среднее просто: X·P(X) + 1·P(1)
.
Учитывая это, WolframAlpha говорит: E(M, N) = (M + (N - 2) N)/((N - 1) N)
.
Умножив эту функцию N log(N)
дает нам (M + (N - 2) N) log(N)/(N - 1)
, что может быть еще более упрощена в Большой Ах вы ищете: O((M/N + N) log(N))
.
Почему мы используем среднее время сравнения для каждой пары внутренних векторов? Разве это не должно быть среднее время сравнения для каждой пары, которое сравнивается алгоритмом сортировки на C++? – Wakaka
@Wakaka Я отредактировал, чтобы сделать его более ясным. –
Спасибо, я понял. Мне просто интересно об этом случае: N-2 вектора длины 1, 2 вектора длины (M-N + 2)/2. Ясно, что это тоже займет очень мало времени. Однако время сравнения может быть до (M-N + 2)/2. Означает ли это, что C++ сортирует (M-N + 2)/2 * N log N time? Я думаю, нам нужно знать, какие именно сравнения выполняются алгоритмом сортировки ... – Wakaka