如何解决关于平方根的时间复杂性问题
我正在尝试回答以下问题:
Given n=2k find the complexity
func(n)
if(n==2) return1;
else n=1+func(sqrt(n))
end
我认为,因为有if-else语句,它肯定会循环n次,但是我对func(sqrt(n))
的递归循环感到困惑。由于它是平方根,所以我认为时间复杂度会
O(sqrt(n)* n)= O(n ^ 1/2 * n)= O(n ^ 3/2)= O(2k ^ 3/2)。但是,可能的答案选择只是
- O(k)
- O(2 ^ n)
- O(n * k)
O(2k ^ 3/2)可以视为O(k)吗?我很困惑,因为尽管通常简化时间复杂度,但是O(n)和O(n ^ 2)不同,所以我认为O(2k ^ 3/2)只能简化为O(k ^ 3/2)
解决方法
我认为这里的答案没有是此问题的最佳答案。
如果您有一个递归函数,该函数会在每次迭代中执行O(1),然后将其参数的大小从n减小到√n,如此处的the runtime works out to O(log log n)。这背后的直觉是,将数字的平方根粗略地丢弃该数字的一半,因此运行时将是O(log d),其中d是输入数字的位数。数字n的位数为O(log n),因此O(log log n)的总体运行时间。
在您的情况下,您有n = 2k,所以O(log log n)= O(log log k)。 (除非您的意思是n = 2 k ,否则O(log log n)= O(log log 2 k )= O(log k)。)>
请注意,我们没有得到O(n×√n)作为结果。如果我们做O(√n)次O(n)次,那将会发生什么。但这不是我们正在做的。输入的大小在每次迭代中均缩小平方根,但这与说我们正在做平方根的工作量不同。而且发生这种情况的次数不是O(n),因为n的值收缩太快了。
类似地,该代码的运行时间将是O(log n),而不是O(n×n / 2):
func(n):
if n <= 2 return 1
return func(n/2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。