我目前正在享受Allen Downey的 Think Complexity ,几个小时前我完成了关于增长率的部分。我暂停阅读和谷歌搜索增长率,并扩大了书给我的信息。我还发现您可以计算算法计算原始数据所需的时间的数量。我有很多问题无法通过谷歌回答,或者我的回答中需要个人接触,因为这真的有助于我理解。我的问题是:
1 - 如何计算简单算法的增长率?例如,我只是编写了这个循环来使用Tayler系列以弧度计算给定角度的正弦值:
for i in range(0, 360):
return sum(((-1)**i / (factorial((2 * i) + 1))) * d ** ((2*i) + 1))
和阶乘:
def factorial(n):
factorial = 1
for i in range(1, n+1):
factorial *= i
return factorial
如何计算其增长率?
2 - 我熟悉了一些非常糟糕的算法,比如Bogosort。使用bogosort对数组进行排序需要花费大量时间。但是你如何计算时间呢?它因计算机而异。
3 - Big-O表示法是什么?它与增长率有什么关系?
感谢您的回答。
答案 0 :(得分:0)
通常,计算函数所需的时间并不是一个好方法,因为它取决于许多因素。出于这个原因,我们经常在计算步骤方面表达复杂性。
存在多种符号(big-Oh,big-Omega,big-Theta)。 Big-Oh表示上限,因此O(n)表示在最坏情况下它将执行n步。
Big-Omega(Ω)是下限,因此Ω(n)表示最少n步。 两者的组合是big-thetaӨ,因此,Ө(n)表示它将只需要n步。
在您的情况下,factorial
被定义为
def factorial(n):
factorial = 1
for i in range(1, n+1):
factorial *= i
return factorial
此函数将从1循环到n + 1,因此,它取决于其参数n。我们可以说它将执行恰好n步,因此,我们可以说factorial
在Ө(n)中。请注意,这显然是线性的。