【问题标题】:Time complexity using Big-O notation使用 Big-O 表示法的时间复杂度
【发布时间】:2013-10-12 11:32:24
【问题描述】:

鉴于B 是一个整数,我无法理解这个时间复杂度O(sqrt(B))

例如,如果我有一个函数...

int GetResult(int A, int B)
{
}

...而这个函数的时间复杂度为O(sqrt(B)),具体时间复杂度是多少?

对不起,如果这有点模糊......我真的不知道如何解释。

【问题讨论】:

  • 这可能意味着计数器将循环到 sqrt(B)。例如,如果您想知道 B 是否是素数,那么您只需检查直到 Sqrt(B) 的可能因子。
  • 基本上这意味着,如果你制作了一个随着 B 增加而运行函数所需时间的图表,那么从长远来看,该图表将非常类似于 B 的平方根的图表。更专业一点,这意味着存在一个常数 C,因此最终会出现一个点,第一个图的线总是 C * sqrt(B) 的图的线之下。这有意义吗?

标签: c# algorithm big-o time-complexity square-root


【解决方案1】:

时间复杂度是函数运行时间相对于其输入数据量的指标。

给定一个函数的 n 个数据项,

  • O(n) 意味着函数将简单地传递每个数据项“一次”。因此,将输入量加倍将使其持续时间加倍。
  • O(n2) 意味着例如一个函数在数据上有两个嵌套循环,因此输入量加倍并等待 4 倍。
  • O(log n) 例如只需要对数时间,例如当您多输入 10 倍时,该函数只会多“一步”。
  • O(sqrt(n)) 因此意味着当您给出 4 倍的调用输入时,该函数只需要两倍的时间。

Big-O-Notation 仅说明函数的扩展方式,而不是实际需要多长时间。例如,Big-O-Notation 忽略了常数因子。例如对某些数据迭代 4 次的函数(依次循环 4 次)需要 O(4n),也就是 O(n)。

这个事实也说明了为什么 O(log10 n) 等于 O(log2 n): 日志10 n = (log2 n) / (log2 10)。由于 (log2 10) 是一个常数因子,在 Big-O-Notation 中可以省略。因此,您可以选择您喜欢的任何日志,这不会意味着 Big-O-complexity 的任何差异。

当你有两个输入时,比如列表 A 和 B,你使用两个变量来表示大小,比如 n 和 B。米。 复杂度为 O(n^2 * log m) 的函数表现如下:

  • 加倍列表 A 会导致执行速度变慢(即 4 倍持续时间),但
  • 加倍列表 B 只会导致在 A 的 O(n2) 处理持续时间内“再迭代一次”(即它只需要 n^2 *(任何未知的常数因子)更长。)

【讨论】:

  • 你对 O(log n) 的第一个解释是不正确的;第二个是正确的。
  • 我喜欢这个答案如何解释 Big O 而没有提到 OP 的 O(sqrt(B))。
  • @Eric,Geobits:我希望,我都修好了。如果没有,请随时编辑并帮助我更新我对 Big-O-Mechanics 的生疏知识;)
【解决方案2】:

您的问题的答案取决于 B。
如果 B = O(n^4),则 O(sqrt(B)) = O(n^2)
如果 B = O(n^2),则 O(sqrt(B)) = O(n)
如果 B = O(n),则 O(sqrt(B)) = O(n^(1/2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多