【发布时间】:2018-03-15 16:11:48
【问题描述】:
我正在准备期中考试,这是过去一年大学论文中的一个问题。 (问题如下) 给定欧几里得算法,我们可以写函数gcd。
def gcd(a,b):
if b == 0:
return a
else:
return gcd(b, a%b)
[约化真分数] 考虑分数 n/d ,其中 n 和 d 是正整数。 如果 n
实现函数 count_fraction,它接受一个整数 n 并返回 n 的约简真分数的个数。假设 gcd 的增长顺序(时间)是 O(logn),那么您在 (B) 部分中编写的函数在时间和空间方面的增长顺序是多少,以 n 表示。解释你的答案。
建议的答案。
def count_fraction(n):
if n==1:
return 0
else:
new = 0
for i in range(1,n):
if gcd(i,n) == 1:
new += 1
return new + count_fraction(n-1)
建议的答案很奇怪,因为这个问题在前几年的趋势,旨在测试纯递归/纯迭代解决方案,但它混合了。尽管如此,我不明白为什么建议的增长顺序是这样给出的。 (我会按照格式、建议的答案、我的答案和我的基础问题来写)
时间:O(nlogn),因为大概是log1+log2+····+log(n−1)+logn
我的时间:O(n^2 log n)。由于有 n 个递归函数调用,每个调用都有 n-1 次迭代,由于 gcd,这需要 O(log n) 时间。
问题 1:我认为时间是计算迭代/递归次数* 1 次迭代/递归所花费的时间。这实际上是我第一次与混合迭代/递归解决方案进行交互,所以我并不真正了解交互。谁能告诉我我是对还是错?
空格:O(n),因为 gcd 是 O(1),而且这段代码显然是线性递归的。
我的空间:O(n*log n)。由于 gcd 是 O(log n) 并且此代码占用 O(n) 空间。
问题 2:我认为空间是计算递归次数* 1 次递归调用占用的空间或所有迭代中所需的最大空间量。首先,我认为 gcd 是 O(log n) 因为我假设递归将发生 log n 次。我想问一下这种差异是否是由于我的讲师所说的。
(我真的不明白我的讲师对阶乘递归的延迟操作或迭代中没有形成新对象的说法是什么。那么你如何接受这样一个事实,即在递归中形成了新对象也没有延迟操作迭代)。
如果你能澄清我对为什么 gcd 是 O(1) 而不是 O(log n) 的疑问,我想如果我将 n*1 用于递归情况,我会同意这个答案。
【问题讨论】:
-
这与您的具体复杂性问题无关,但问题范围的描述似乎完全错误。如果你只是限定
n,那么n < d的真分数是无限的。为什么1/x不包含在列表中的每个正值x?实际绑定似乎在d,而不是n。或者更确切地说,它们都在:n < d <= bound -
@Blckknght 我承认我发现 qns 也不清楚,从他们给我的列表中给出。但我只是一个学生,可能考官没有用文字很好地解释上下文。我们应该只使用基于示例的内容吗?我总是这样做,而不是怀疑上下文是否合法。
标签: python-3.x time-complexity