对于我的一个家庭作业练习,我必须计算算法中的步数并证明一个紧束但是我根本无法弄清楚这个循环作为大小n列表的函数迭代的次数的精确等式。
n = len(A)
value = 0
index = 0
step = 1
while index < n:
value = A[index] - value
index = index + step
step = step + 1
这里的步骤每次迭代增加一次,因此指数不会线性增加,我正在努力寻找一个方程来表示它如何增加。如果我查看与大小n相比的迭代次数表,它看起来像sqrtn一样增长但我找不到更精确的描述迭代的确切数量。
有人能帮助我或指导我朝正确的方向发展吗?
答案 0 :(得分:1)
你的循环将运行index < n
(我知道你知道,请耐心等待)。
索引可以看作以下系列
I = 0 , 1 , 3 , 6 , 10 , 15
其中每个术语是前一个加上距起点的距离:index = index + step
。这可以用数学术语正式写成
S = 0, 1, 3, 6, 10 ..... I(k-1), I(k)
^^^^^^^^^ k terms ^^^^^^^^^^^^^^
,其中
I(k) = I(k-1) + k
I(k)
接近n
(A的长度)的速度是所需的复杂程度(我相信你已经在课堂上解决了类似的问题以进行这样的分配)。< / p>
答案 1 :(得分:0)
以下是一些可帮助您探索此问题的代码:
def calls(n):
index = 0
step = 1
call = 0
while index < n:
index += step
step += 1
call += 1
return call
UPTO = 500
for i in range(1, UPTO):
print("{:>4}: {}".format(i, calls(i)))
给出了
1: 1 # 1 1
2: 2
3: 2 # 2 2s
4: 3
5: 3
6: 3 # 3 3s
7: 4
8: 4
9: 4
10: 4 # 4 4s
11: 5
12: 5
13: 5
14: 5
15: 5 # ...
16: 6
# etc
编辑:好的,下一步:我们可以看到
calls(n) == k such that (k - 1) * k / 2 < n <= k * (k + 1) / 2
(k
是2 *n <= k * (k + 1)
)
我们可以引入delta 0 <= delta < 1
,k' = k - delta
,2 * n == k' * (k' - 1)
;解决k',然后k = ceil(k')
,QED。