【发布时间】:2020-10-30 08:10:18
【问题描述】:
我为什么要问这个问题
我最近开始读 Scp,我已经工作了 我去Section 1.2.3。 我无法理解成长秩序的一些细节。请多多包涵 我的问题太长了。另请注意,我以前从未处理过分析算法。
我在 Scp 中读到的内容以及我对它的看法
以下是 Scp 的几段文字:
n 的确切值是多少?
让 n 成为衡量问题大小的参数。在我们之前的示例中,我们将 n 视为给定的数字 函数将被计算,但还有其他可能性。例如, 如果我们的目标是计算一个数的平方根的近似值, 我们可能会将 n 视为所需的位数精度。
对于牛顿法求平方根,采用Section 1.7 中给出的以下过程:
(define (sqrt x)
(sqrt-iter 1.0 x))
这是(sqrt-iter)
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
good-enough? 检查guess 的近似值是否足够好
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))
现在,根据 Scp,0.001 应该是 n,但不应该在 (sqrt x) 中输入 n 吗?
迭代次数根据输入x变化,即需要的迭代次数
会根据数字的大小而变化。
这是我的 python 等效证明:
In [33]: sqrt(2)
1
1.5
1.4166666666666665
achieved 1.4142156862745097 in 3 iterations
In [34]: sqrt(4)
1
2.5
2.05
2.000609756097561
achieved 2.0000000929222947 in 4 iterations
In [35]: sqrt(1024)
1
512.5
257.2490243902439
130.61480157022683
69.22732405448895
42.00958563100827
33.19248741685438
32.02142090500024
achieved 32.0000071648159 in 8 iterations
所以0.001 不应该是 k1 或 k2,因为它是一个恒定的值并且独立于
n(这里是我们输入到sqrt的值)?
R(n)不是恒定的吗?
让 R(n) 为处理大小为 n 的问题所需的资源量。 R(n) 可能 测量使用的内部存储寄存器的数量、执行的基本机器操作的数量等等。在计算机中 一次只执行固定数量的操作,所需时间为 与执行的基本机器操作的数量成正比。
在这里,Sicp 说 R(n) 可能是执行的基本操作的数量,但是 执行的操作数量不是因操作系统而异吗?作为 Linux 机器可能 执行一组步骤,另一台 FreeBSD 机器,另一台 Windows 机器? 你很快就会明白我为什么这么说。
增长顺序
我们说R(n)有增长顺序Θ(f (n)),写成R(n) = Θ(f (n ))(读作“theta of f (n)”),如果存在独立于 n 的正常数 k1 和 k2 使得 k1 f (n) ≤ R(n) ≤ k2 f (n) 对于任何足够大的值 n. (换句话说,对于较大的 n,值 R(n) 夹在 k1 f (n) 和 k2 f (n).)
现在,据我了解,我们通过做一些代数来计算资源的增长
从函数R(n) 和f(n) 接收值(R 是一个函数吗?f 我在想什么?我不知道!)
阶乘和斐波那契数列示例
例如,使用线性递归过程计算阶乘 在第 1.2.1 节中描述的步骤数与 输入 n。因此,此过程所需的步骤随着 Θ(n) 的增长而增长。我们也 看到所需的空间随着 Θ(n) 的增长而增长。对于迭代阶乘, 步数仍然是 Θ(n),但空间是 Θ(1),即常数。这 树递归斐波那契计算需要 Θ(ϕn) 步长和空间 Θ(n), 其中 φ 是 1.2.2 节中描述的黄金比例。
现在这对我来说是没有意义的部分 - 我认为一个步骤是什么? 我是否考虑使用替换模型的替换次数? 或者我是否考虑评估的表达式数量?还是我考虑什么时候 算术运算吗?
我知道在递归过程和迭代 Θ(1) 中,空间是 Θ(n)(因为解释器每次递归都需要记住 1 件事)(作为解释器,带有 x 的某个值并继续.) 我不明白斐波那契计算(树递归)如何使用 Θ(n)。
我也不知道前面的n与步数有什么关系。
我的问题
所以这里列出了我所有与成长顺序有关的问题:
-
算法中的哪个精确值是 n?
-
R(n)会发生什么? (当然假设它是一个函数)n 是否除/乘一个值?
-
我认为一个步骤是什么?
-
如何计算步数和空间的增长顺序。
简而言之:
什么是增长顺序,我如何计算它?
【问题讨论】:
-
您可以使用Master Theorem 计算它,但您可以使用挂钟measure an approximation of it 并将大小-时间点放在对数图上。
-
简短的回答是,我们想针对不同的问题大小预测某种算法的运行时间。所以我们需要知道运行时间如何随着大小的增长而增长 - 作为对数、线性、线性、幂律、指数等。然后我们测量小尺寸的运行时间,并且可以预测我们感兴趣的更大尺寸。如果它是一百万年,那么我们就不会浪费时间等待它完成,一切都是徒劳的。
-
@WillNess 我明白了。我的主要问题是你如何计算它,阿明的回答和你对主定理的评论回答了它。谢谢你的链接
标签: time-complexity scheme lisp complexity-theory sicp