Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;排序向量时间复杂度 假设n向量具有向量L < />,所有向量中求出的代码> INT/C> > s的总数最多。标准C++排序排序(L开始(),L结尾)(< /代码> )是什么时候最严格的时间复杂度?_C++_Performance_Sorting_Vector_C++ Standard Library - Fatal编程技术网

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