【问题标题】:How can I find the temporal complexity of this algorithm?我怎样才能找到这个算法的时间复杂度?
【发布时间】:2021-05-02 17:30:09
【问题描述】:
fun xpto(n: Int, m: Int): Int {
    return if (n / m == 0) 0 else 1 + xpto(n / m, m)
}

m 如何影响时间复杂度?我的第一个想法是 O(n),但我不确定。

【问题讨论】:

  • 第二个函数xpto是关于什么的?请只问一个问题。其次,var n = n的作用是什么?看起来像没有操作...第三,BinarySearch 知道数组的大小是多少(因为它没有获取大小参数)?
  • 第二个xpto在n
  • 你能把你的问题限制在一个问题上吗?
  • 如何找到第二种算法的时间复杂度?
  • 请更新您的问题(使用下方的编辑链接),以便提出关于 one 的问题。您冒着被关闭的风险。

标签: algorithm time-complexity binary-search


【解决方案1】:

此函数将第一个参数除以第二个参数,并再次将该商用作下一次调用的第一个参数,只要该商不为零。对于正整数,递归调用的次数因此等于最大幂?使得

     ? / ?? >= 1,或

      ? >= ??

因此递归调用的次数?是

     ? = log??

这也是函数将返回的值,因为每次递归调用都会将 1 添加到递归返回的结果中。

时间复杂度

假设我们可以将除法视为常数时间运算,因此我们的时间复杂度为 O(log?)。 ? 的值(即对数的底)与大 O 表示法无关,因为它提供了 upper bound。请注意对于给定的 ? 值,增加(绝对)的 ? 值如何不会增加算法所花费的时间。

但是,我们可以在大 ? 和 ? 的类别中降低渐近上限。例如,在 ?

以下所有时间复杂度表达式都适用于该算法:

  • 渐近上界:O(log?)

  • 渐近下界:Ω(1)

  • 渐近紧界:ϴ(log??)

负输入

参数的符号没有影响,因为递归调用的数量只取决于两个参数的绝对值。

如果至少有一个参数是负数,我们还必须假设整数除法(在实际编程语言中)将向零舍入,否则算法可能进入无限递归,总是产生-1的商。

限制

  • ? 应该不为零,否则会出现除零异常。
  • abs(?) 不应为 1,因为当 ? 非零时,这将导致无限递归。有关相关讨论,请参阅 log base 1 of 1

【讨论】:

  • 如果参数是负整数怎么办?
  • 有想过吗?您会发现如果? 为负数,则第一个参数 (?) 的符号将在每次下一次递归调用时切换。如果 ? 是正数,那么 ? 将在每个递归调用中保留其原始符号。但真正重要的是,? 的绝对值将以同样的方式演变,直到商为零,因此对于 xpto(n, m)xpto(-n, m)xpto(n, -m)xpto(-n, -m).
  • O(log n) 和 O(log_m(n)) 当 m 是输入时不是相同的复杂度类,尽管说算法是 O(log n) 是正确的,因为那是更大的类(当 m 是整数时)。也就是说,算法是 O(log n) 和 Theta(log_m(n)) 但不是 Theta(log n)。
  • 是的,这是一个重要的评论。 Big-O 给出了一个上限。对于紧界 ? 必须保留在表达式中:ϴ(logₘ?)。扩展我的答案以涵盖这一点。谢谢,@Paul。
猜你喜欢
  • 2020-01-08
  • 2020-11-12
  • 2020-10-27
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2018-02-08
  • 1970-01-01
相关资源
最近更新 更多