【问题标题】:What will be Big-O complexity for a recursive function whose number of calculations oscillate with n?对于计算次数随 n 波动的递归函数,Big-O 复杂度是多少?
【发布时间】:2019-10-18 12:22:22
【问题描述】:

我有一个找到指数的函数,但我对函数的复杂性感到困惑。

功能:

def expo(number, exponent):
    if exponent == 0:
        return 1
    elif exponent % 2 == 0:
        val = expo(number, exponent / 2)
        return  val * val
    else:
        return number * expo(number, exponent - 1)

我尝试根据指数计算并绘制计算次数的图表并得到以下结果: 图表: 指数:计算:

1:2、2:3、3:4、4:4、5:5、6:5、7:6、8:5、9:6、10:6、11:7、12:6 , 13:7, 14:7, 15:8, 16:6, 17:7, 18:7, 19:8, 20:7, 21:8, 22:8, 23:9, 24:7, 25 : 8, 26: 8, 27: 9, 28: 8, 29: 9, 30: 9

正如您所见,计算次数在波动,我认为 Big-O 表示法不会是线性的或二次的。我认为它会像一个多度多项式,具有类似的表示

我是对的还是我对 O(n) 表示法有错误的想法?

【问题讨论】:

  • 这看起来像快速求幂算法,复杂度为 O(log(n)):en.wikipedia.org/wiki/Exponentiation_by_squaring
  • 也许您应该以对数刻度绘制横坐标以获得一些见解。
  • @pLOPeGG 是的,我认为这是相同的算法,虽然我不明白复杂度是如何计算的,但它仍然回答了我的问题,谢谢

标签: python algorithm big-o complexity-theory


【解决方案1】:

这是一种众所周知的算法,称为快速求幂(有时是平方和乘法),其复杂度为O(log(n))。维基百科有一整页:https://en.wikipedia.org/wiki/Exponentiation_by_squaring

但如果您不知道这些信息,一种想法是重写您的算法,以便您可以轻松找到递推公式。 主要困难是应用于奇数和偶数的不同程序。诀窍是将它们组合在一起并仅进行一次递归调用。

def expo(number, exponent):
    if exponent == 0:
        return 1
    elif exponent % 2 == 0:
        val = expo(number, exponent / 2)
        return  val * val
    else:
        return number * expo(number, exponent - 1)  # exponent - 1 is even !

可以改写

def expo(number, exponent):
    if exponent == 0:
        return 1
    elif exponent % 2 == 0:
        val = expo(number, exponent / 2)
        return  val * val
    else:
        return number * expo(number, (exponent - 1) / 2) ** 2

现在您可以看到,在算法的每一步,exponent (大致)除以 2(这不再取决于其奇偶性),因此复杂度为 log(n)

【讨论】:

    【解决方案2】:

    首先,您可以考虑最坏情况的算法。因此,如果T(n) 是算法的时间,最坏的情况是T(n) = T(n-1) + cc 是一个常数,用于比较、求和、调用函数……)。因此,T(n) = O(n)

    另外,声明I think O(n) will not be linear or quadratic 没有意义。如果一个函数在O(n) 中,则意味着它最多是线性的。因此,它不可能是二次的。

    现在您可以更仔细地检查时间复杂度计算,并尝试找到复杂度的严格界限。因为,至少在两次连续递归中,我们将得到 exponent 的偶数值(因为我们有 -1,如果 exponent 是奇数),因此,exponent 达到 1,与最多 2 log(n) 的计算(因为指数将至少在每 2 次连续递归中除以 2)。因此,T(n) 的紧界是O(log(n))

    【讨论】:

    • 是的,你是对的 O(log(n))
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    相关资源
    最近更新 更多