C++;排序向量时间复杂度 假设n向量具有向量L < />,所有向量中求出的代码> INT/C> > s的总数最多。标准C++排序排序(L开始(),L结尾)(< /代码> )是什么时候最严格的时间复杂度?
C++;排序向量时间复杂度 假设n向量具有向量L < />,所有向量中求出的代码> INT/C> > s的总数最多。标准C++排序排序(L开始(),L结尾)(< /代码> )是什么时候最严格的时间复杂度?,c++,performance,sorting,vector,c++-standard-library,C++,Performance,Sorting,Vector,C++ Standard Library,vector比较函数的运行时间最多为O(M),因此一个明显的界限是O(NM log N)。但是,如果我们实现标准的mergesort,我们可以看到在每个O(logn)级别中,大多数O(M)整数比较都完成了,因此运行时是O((N+M)logn)。这是因为比较长度A和B的两个向量需要O(min(A,B))时间 C++标准是否保证运行时为O((n+m)log n)?< /p> < p>信息不足。您还需要知道M值在N向量中的分布。当你有了它,那么就可以直接找到整体的复杂性: std::sort的复杂性
vector
比较函数的运行时间最多为O(M),因此一个明显的界限是O(NM log N)。但是,如果我们实现标准的mergesort,我们可以看到在每个O(logn)级别中,大多数O(M)整数比较都完成了,因此运行时是O((N+M)logn)。这是因为比较长度A和B的两个向量需要O(min(A,B))时间
C++标准是否保证运行时为O((n+m)log n)?< /p> < p>信息不足。您还需要知道
M
值在N
向量中的分布。当你有了它,那么就可以直接找到整体的复杂性:
std::sort
的复杂性是O(N·log(N))
比较std::vector
使用std::词典学_比较(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)
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\u compare
将只有一个其他元素可以进行比较。因此,对于这个特定的发行版,我的复杂性总是O(N·log(N))
。但是如果是均匀分布,我将得到O(M·log(N))
编辑2:在您定义发行版的注释之后,让我们尝试查找
E(M,N)
首先,请注意总共有T=(N选择2)=N(N-1)(1/2)
不同的向量比较组合
一个(且仅一个)组合将进行X=O((M-N+2)(1/2))
比较,并有发生概率p(X)=1/T
每一个其他组合只需要比较(O(1)
),因此这些情况发生的概率p(1)=(T-1)/T
求平均值很简单:X·p(X)+1·p(1)
鉴于此,表示:E(M,N)=(M+(N-2)N)/((N-1)N)
将该函数乘以
N log(N)
可以进一步简化为您要寻找的大Oh:O((M/N+N)log(N))
没有足够的信息。您还需要知道M
值在N
向量中的分布。当你有了它,那么就可以直接找到整体的复杂性:
std::sort
的复杂性是O(N·log(N))
比较std::vector
使用std::词典学_比较(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)
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\u compare
将只有一个其他元素可以进行比较。因此,对于这个特定的发行版,我的复杂性总是O(N·log(N))
。但是如果是均匀分布,我将得到O(M·log(N))
编辑2:在您定义发行版的注释之后,让我们尝试查找
E(M,N)
首先,请注意总共有T=(N选择2)=N(N-1)(1/2)
不同的向量比较组合
一个(且仅一个)组合将进行X=O((M-N+2)(1/2))
比较,并有发生概率p(X)=1/T
每一个其他组合只需要比较(O(1)
),因此这些情况发生的概率p(1)=(T-1)/T
求平均值很简单:X·p(X)+1·p(1)
鉴于此,表示:E(M,N)=(M+(N-2)N)/((N-1)N)
乘以函数b
60% -> k < 2.5
70% -> k < 3.4
80% -> k < 5.0
90% -> k < 10.0