我的老师在算法过程中给了我们一个非常难的问题。
让我们考虑下面的代码,其中random(a)
是一个基元,它返回一个随机整数值,均匀分布在[0;a]
中,并且具有复杂度Theta(1)
。
int test(int n)
{
if(n<=2) return n;
int i = random(n-2);
return test(i) + test(n-2-i);
}
什么可以返回n = 9的函数;
表达式测试(2016)的最小值是什么?
表达式测试(2016)的最大值是什么?
我试图概括通用步骤k
的表达式,但我陷入了概率性的事情,我不知道如何表达它们。
它不是一个家庭作业,它只是值得思考的东西。
答案 0 :(得分:1)
让我们尝试为i:3..9计算测试(i)以知道它可以返回9
我们有test(n)= test(i)+ test(j),其中i + j = n-2,i <= n-2且j <= n-2
test(3)= test(1)+ test(0)= 1
test(4)= test(2)+ test(0)|| test(1)+ test(1)= 2
test(5)= test(3)+ test(0)|| test(2)+ test(1)= 1 || 3(这里开始出问题)
test(6)= test(4)+ test(0)|| test(3)+ test(1)|| test(2)+ test(2)= 2 || 4
test(7)= test(5)+ test(0)|| test(4)+ test(1)|| test(3)+ test(2)= 1 || 3
test(8)= test(6)+ test(0)|| test(5)+ test(1)|| test(4)+ test(2)|| test(3)+ test(3)= 2 || 4
test(9)= test(7)+ test(0)|| test(6)+ test(1)|| test(5)+ test(2)|| test(4)+ test(3)= 1 || 3 || 5
因此,如果n%2 = 0,则test(n)可以返回低于n的偶数,并且在另一种情况下(即很酷),低于n的偶数()
至于最小测试(2016),如果随机总是返回0,你将有测试(2016)=测试(2014).... =测试(2)= 2
对于最大测试(2016),它是1008,如果随机总是返回(n-2)/ 2
我实际上编辑测试(2016)= 1008
test(4n)可以返回{2,4,...,2n}
test(4n + 1)可以返回{1,3,...,2n + 1}
test(4n + 2)可以返回{2,4,...,2n + 2}
test(4n + 3)可以返回{1,3,...,2n + 1}
我认为这可以通过归纳来验证,对于n = 1,这是正确的
测试(4n + 4)=测试(2)+测试(4n)因为测试(4n)可能返回= 2n我们有测试(4n + 4)可能返回2n +测试(2)= 2n +2
因为测试(4n + 4)可以返回测试(4n + 2)并且测试(4n)=&gt; test(4n + 4)可以返回test(4n)=&gt;返回的所有值。它可以返回{2,4,... 2n + 2}
很明显,测试(4n + 4)不能返回一个数字,它是两个测试(i)和测试(j)的总和,因为i + j = 4n + 4,i和j都是偶数或者是偶数和归纳的假设,结果是偶数。
最后一步是证明测试(4n + 4)不能大于2n + 2:
测试(4n + 4)=测试(i)+测试(j),其中i + j = 4n + 2,再次使用感应的假设max(test(i)=&lt;(i / 2)+1和max(test(j))&lt; =(j / 2)+1
所以测试(4n + 4)&lt; = 2n + 3并且因为它是偶数测试(4n + 4)&lt; = 2n + 2.