我一直试图设置关于迭代和i然后j的清晰信息,但是当我试图弄清楚while循环时我会陷入困境? 有人可以给我一些关于如何解决这样的问题的信息吗?
答案 0 :(得分:2)
免责声明:这个答案冗长且过于冗长,因为我想为OP提供“婴儿步骤”方法,而不是结果。我希望她能从中找到一些帮助 - 是否需要它。
如果您在尝试一次性获得复杂性时遇到困难,可以尝试将问题分解为更容易推理的小块。 在这种情况下,引入符号可以帮助构建您的思维过程。
让我们为内部while
循环引入一个表示法。我们可以看到起始索引j
取决于n - i
,因此此循环执行的操作数将是n
和i
的函数。让我们用G(i, n)
表示这个操作数。
外部循环仅取决于n
。我们用T(n)
表示操作次数。
现在,让我们记下T(n)
和G(n, i)
之间的依赖关系,仅推断外部循环 - 我们不关心此步骤的内部while
循环,因为我们已经在函数G
中抽象了它的复杂性。所以我们选择:
T(n) = G(n, n - 1) + G(n, n - 2) + G(n, n - 3) + ... + G(n, 0)
= sum(k = 0, k < n, G(n, k))
现在,让我们关注函数G
。
j(t)
循环执行的j
次迭代中写下t
索引while
的值。k
违反了while循环不变量的t
的值,即最后一次评估条件。i
。如果有帮助,您可以尝试使用i
的几个特定值(例如1,2,n
)。 我们可以写:
j(0) = n - i
j(1) = n - i - 3
j(2) = n - i - 6
...
j(k - 1) = n - i - 3(k - 1) such that j(k-1) >= 0
j(k) = n - i - 3k such that j(k) < 0
查找k
涉及解决不等式n - 1 - 3k < 0
。为了更容易,让我们“忽略”k
是一个整数的事实,我们需要取下面结果的整数部分。
n - i - 3k < 0 <=> k = (n - i) / 3
因此需要考虑(n - i) / 3
个“步骤”。通过步骤,我们在这里指的是循环条件的评估次数。执行操作j <- j - 3
的次数将是后者减去一次。
所以我们找到了G(n, i)
的表达式:
G(n, i) = (n - i) / 3
现在让我们回到我们在(3)中找到的T(n)
的表达式:
T(n) = sum(k = 0, k < n, (n - k) / 3)
由于k
从0变为n
时,n - k
从n
变为0,我们可以将T(n)
等效地写为:
T(n) = sum(k = 0, k <= n, k / 3)
= (1/3).sum(k = 0, j <= n, k)
= (1/6).n.(n+1)
因此你可以用
结束T(n) = Theta(n^2)
此分辨率展示了一些模式,您可以从中创建自己的配方来解决类似的练习:
答案 1 :(得分:1)