[英]Understanding the time and space complexity of this problem
我有以下代碼。 有人告訴我,它的時間復雜度是 O(n)。 但我很難理解如何。 對我來說,它似乎是 O(n) + O(n) + O(n) = O(3n),空間復雜度也是 O(3n),因為 3 個向量填充到 n 的大小。 我的理解正確嗎?
void productofself(std::vector<int> v)
{
int multipliedProduct = 0;
std::vector<int> left;
std::vector<int> right(v.size());
std::vector<int> result;
for (int i = 0; i < v.size(); i++)
{
if (i == 0)
{
multipliedProduct = 1;
}
else
{
multipliedProduct *= v[i - 1];
}
left.push_back(multipliedProduct);
}
for (int i = v.size() - 1; i >= 0; i--)
{
if (i == v.size() - 1)
{
multipliedProduct = 1;
}
else
{
multipliedProduct *= v[i + 1];
}
right[i]=multipliedProduct;
}
for (int i = 0; i < v.size(); i++)
{
result.push_back(left[i] * right[i]);
}
}
我認為你錯過了漸近符號的重點。 該代碼是O(3n) 但它也是 O(n) 而后者才是最重要的。
O(3n)
和O(n)
根據定義是等價的。
我們說f(x)
是O( g(x) )
如果存在兩個常數m
和k
使得f(x) < m * g(x)
對於所有x
大於k
。 基本上f(x)
是O(g(x))
如果對於足夠大的x
, f(x)
總是小於一個常數因子乘以g(x)
。
因此,您可以在該定義中看到常量因子: m
。 洗滌時會出現像 3 這樣的比例因子。 存在一個m
使得3 * n < m * n
,即任何大於 3 的數。所以函數f(n) = 3*n
是O(n)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.