func(p)的大O时间复杂度是多少? C ++代码如下。
int get_power(int a, int b)
{
if(!b) return 1;
if(b%2) return a * get_power(a, b/2);
return get_power(a, b/2);
}
int func(int p)
{
int sum = 0;
for(int i = 1; i <= p; ++i)
{
sum += get_power(i, 5);
}
return sum;
}
int main()
{
int c;
scanf("%d",&c);
func(c);
}
根据我的理解,复杂性将是O(p)!! 这是对的吗??? 任何机会都是O(p * log5)
答案 0 :(得分:4)
抱歉我的英语不好;我之前从未写过任何包括英语数学的文章。
您似乎误解了O()
的含义。
&#34; f(x)是O(g(x))&#34;表示X
存在f(x) <= N * g(x)
,x > X
为N
,其中f(x) = log2 * x
为常量。
例如,假设f(x) <= log2 * g(x)
。明确g(x) = x
N
。所以我们可以说&#34; f(x)是O(x)&#34;。 (我说log2
是不变的;如你所知,f(x) = x^2
是不变的。)
但是,当谈到f(x) > N * x
时,f(x)不 O(x),因为x > N
位于X
。 无法存在f(x) <= N * x
,这使得X > x
func
的确如此。
您询问O(p)
的复杂程度是O(p * log5)
还是f(x) <= N * g(x)
。答案:两者都是真的。
...
N
O(g(x) * log5)
O(g(x))
是常数......
正如您从这句话中所知,O()
等于{{1}}。常数倍不会对{{1}}产生任何影响。
答案 1 :(得分:1)
大O表示法只定义了函数的限制行为。因此,不需要日志常量,因为这不会定义其行为