我不完全确定这个 [重复] 的大 O 复杂性

Posted

技术标签:

【中文标题】我不完全确定这个 [重复] 的大 O 复杂性【英文标题】:I'm not entirely sure the Big O complexity of this [duplicate] 【发布时间】:2019-05-31 15:54:57 【问题描述】:

这将在未排序的数组中找到第 n 个元素,就好像它已排序一样,我希望它在 n log n 时间以下运行,但我不完全确定它的运行时间,会不会是 O(n ^2)?

int nthElement(std::vector<int> vec, int n)

  n--;
  int smallest = vec[0];
  int index = 0;
  for(int i = 0; i < vec.size(); i++)
  
    if (vec[i] < smallest)
    
      smallest = vec[i];
      index = i;
    
  
  vec.erase(vec.begin() + index);
  if( n == 0)
  
    std::cout << "Do I get here?" << std::endl;
    return smallest;
   
  return nthElement(vec, n);

【问题讨论】:

你为什么不想使用std::nth_element 我只是想为自学类型的事情做这个。 是的,O(n^2)。一个 n 用于 for 循环,一个 n 用于尾递归。 这个复杂度是O(n x size) @Damien O(n x size),大小是一个常数,将简化为 O(n) 【参考方案1】:

问问自己,nvec.size() 相比是什么。假设n0vec.size()-1 之间是随机的,则以下情况成立: - 在最好的情况下,n = 0. - 在最坏的情况下,n = vec.size(). - 一般情况下,n ~ vec.size()~ 表示成比例)。

所以一般来说时间复杂度确实是O(n^2) = O(vec.size()^2) = O(n*vec.size())

【讨论】:

以上是关于我不完全确定这个 [重复] 的大 O 复杂性的主要内容,如果未能解决你的问题,请参考以下文章

while 循环的时间复杂度

这个递归斐波那契的大 O 时间复杂度?

回溯解决方案的大 O 计算范围内的排列

无法弄清楚这种重复的复杂性

在 Pandas DataFrame 中反转列顺序的大 O 复杂度是多少?

算法的大 O 复杂性 - LZW 和 Huffman