以下函数的时间复杂度是多少
What is the time complexity of the following function?
int func(int n){
if(n==1)
return 0;
else
return sqrt(n);
}
其中sqrt(n(是一个C math.h库函数。
- O(1(
- O(lg n(
- O(lg lg n(
- O(n(
我认为运行时间完全取决于sqrt(n(。但是,我不知道这个功能实际上是如何实现的。
附言:据我所知,求一个数的平方根的一般方法是用牛顿法。如果我没有错的话,用牛顿方法计算的时间复杂度是O(lgn(。那么答案应该是O(lgn(吗?
p.p.S.在我最近参加的一次考试中得到了这个问题。
我将给出一个更一般的案例答案,而不假设int
的大小不变。
答案是Theta(logn)
。
我们知道newton-raphson是Theta(logn(-不包括Theta(n)
(假设sqrt()
尽可能有效(。
然而,一般数字n
需要log_2(n)
位进行编码,并且您需要读取所有这些位才能获得准确的sqrt()
函数。这不包括Theta(1)
和Theta(log(log(n))
。
由上可知,函数的复杂度为Theta(log(n))
。
顺便说一句,由于O(log(n))
是O(n)
的子集,它也是一个有效的答案,尽管不是严格的答案。有关大Theta和大O及其差异的更多信息,你可能想看看这个帖子。
这取决于sqrt
的实现,也取决于您感兴趣的时间复杂性。
我想说,你可以认为它是"常数",所以O(1(,在这个意义上:如果你放入一个随机的int
,它平均需要相同的时间。(原因:多数字的数字要常见得多(。
但请看这里。另一个可能的答案是O(M(n((,其中M(n是乘法的复杂度,n是整数中的位数。
这看起来像是一个课本上的问题,可能是一个陷阱。老师可能想检查你是否可以区分计算一系列数字的sqrt
(它将是O(n((和一个数字(它将为O(1((。
请注意,"正确"的答案通常也取决于提问的背景。
设n=2^m
给定T(n(=T(sqrt(n((+1
T(2^m(=T(2^ m-1(+1
设T(2^m(=S(m(
然后,
S(m(=2S(m/2(+1
使用主定理-
S(m(=θ(m(
=θ(log(n((
因此,时间复杂度是θ(log(n((。
- while循环中while循环的时间复杂度是多少
- 函数的时间复杂度是多少?
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 给定C++代码的时间复杂度是多少?
- 将数组的元素插入映射的时间复杂度是多少?
- 以下递归代码的时间复杂度是多少?
- 在C++中修改字符串的BigO时间复杂度是多少
- 这个算法的运行时间复杂度是多少?你是如何分析的
- 此特定代码的时间复杂度是多少?
- % 运算符的时间复杂度C++是多少?
- 三和算法的时间复杂度是多少
- 以下代码片段的时间复杂度是多少?
- 用于搜索的给定代码的时间复杂度是多少
- std::map的时间复杂度是多少
- 遍历二维数组的时间复杂度是多少
- 这个代码(来自leetcode)的时间复杂度是多少
- 以下代码的时间复杂度是多少
- 这个算法的时间复杂度是多少
- 以下循环的时间复杂度是多少
- 一个清晰的函数的时间复杂度是多少,根据大 O,是 std::map