没有足够的信息。您还需要了解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。
您可以使用Discrete Probability Distribution theory 找出E(M, N) 函数对于M 跨N 的任何分布是什么。
编辑 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))。
编辑 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),可以进一步简化为您正在寻找的Big Oh:O((M/N + N) log(N))。