我不完全确定这个 [重复] 的大 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】:
问问自己,n
与 vec.size()
相比是什么。假设n
在0
和vec.size()-1
之间是随机的,则以下情况成立:
- 在最好的情况下,n = 0
.
- 在最坏的情况下,n = vec.size()
.
- 一般情况下,n ~ vec.size()
(~
表示成比例)。
所以一般来说时间复杂度确实是O(n^2) = O(vec.size()^2) = O(n*vec.size())
。
【讨论】:
以上是关于我不完全确定这个 [重复] 的大 O 复杂性的主要内容,如果未能解决你的问题,请参考以下文章