【问题标题】:I'm not entirely sure the Big O complexity of this [duplicate]我不完全确定这个 [重复] 的大 O 复杂性
【发布时间】: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)

标签: c++


【解决方案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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多