【发布时间】:2017-02-11 08:17:29
【问题描述】:
我使用的是 C# 语法,但这个问题不仅仅针对 C#。
示例 1
public static long Do(long n)
{
var sqrt = (long)Math.Sqrt(n);
for(long i = 0; i < sqrt; i++)
// do something
return result;
}
这仍然是线性时间,即使在最坏的情况下,我们也只对n 的平方根时间进行运算,这只是@987654324 的一小部分@?
示例 2
您如何对下面算法的时间复杂度进行分类?
public static long Do(long n)
{
while (n > 1)
{
n = (long)Math.Sqrt(n);
// do something
}
return result;
}
在最坏的情况下,这是否会被称为在 对数时间 内完成的操作,即使我们再次将每次迭代次数减半,而是将它们减少了一个数量级幅度超过一半。
【问题讨论】:
-
如果你在做 sqrt(n) 操作,那将是 O(sqrt(n)) 复杂度,为什么是线性的?
-
第一个是
O(n^(1/2))。第二个有点棘手。 -
O(sqrt(n))有术语吗? -
O(sqrt(n)) 是 O(sqrt(n)) 的“术语”......不知道还有什么。此外,在此示例中,请注意“输入大小”。因为你实际上没有 n 个元素,而是一个整数 n,所以时间复杂度通常以输入整数的大小(以位为单位)给出(因为图灵机)。将输入大小增加一位会使 n 加倍,使其花费 sqrt(2) 更多时间——因此按照这种方法,这将是指数级的,或者 O(sqrt(2) ^ n)(这个“n”与您的变量 n) 不同
-
在维基百科 (en.wikipedia.org/wiki/Time_complexity) 中它被命名为“分数幂”
标签: c# algorithm time-complexity big-o computer-science