【问题标题】:Determination of computational complexity of sample code示例代码计算复杂度的确定
【发布时间】:2015-01-25 16:44:58
【问题描述】:

我给你三个短代码:

第一个代码:

procedure Proc (n:integer)
  begin
  if n>0 then
    begin
    writeln('x')
    Proc(n-2)
     writeln('*');
     Proc(n-2)
     end 
   end

第二个代码:

procedure Proc (n:integer)
  begin
  if n>0 then
    begin
    writeln('*');
    Proc(n-1)
    end 
   end

第三个代码:

procedure Proc (n:integer)
  begin
  if n>0 then
    begin
    writeln('x')
    Proc(n/2)
     writeln('*');
     Proc(n/2)
     end 
   end

我想知道如何确定我给出的每个代码的计算复杂度,因为它会帮助我更好地理解.. 有人可以编写一个算法来逐步确定示例代码的计算复杂度,并做是否可以将此算法应用于其他代码示例?

【问题讨论】:

    标签: complexity-theory


    【解决方案1】:

    第一个问题:假设你知道对于 n - 2 的值,Proc 被调用了 T(n-1) 次。因此,对于 n 的值,T(n) = 1 + 2T(n-2),因为会调用一次 Proc(n),然后调用 Proc(n-2) 两次。 T(n) = 1 + 2T(n-2) 是河内塔的变体,即 T(n) = 1+2T(n-1)。这里有证据http://en.wikipedia.org/wiki/Tower_of_Hanoi 证明 T(n) = 1+2T(n-1) = 2^n-1。因此 T(n-1) = 1+2T((n-1)-1)= 1+2T(n-2) = 2^(n-1) -1。在您的情况下,T(n) = 1 + 2T(n-2) = 2^(n-1) -1。换句话说,减去河内塔问题中的所有其他项可以节省大约一半的调用。 2^(n-1) - 1 = 2^n/2 - 1,即 O(2^n)。

    第二个问题:这比较容易。 T(0) = 1 和 T(n) = 1 + T(n-1)。您可以通过许多不同的方式来解决这个问题,但其中一种是通过伸缩:

    T(n) = 1 + T(n-1)

    T(n-1) = 1 + (n-2)

    ...

    T(1) = 1 + T(0)

    两边相加...

    T(n) + T(n-1)+...+T(1) = 1 + T(n-1) + ... + 1 + T(0) = n + T(n- 1)+...+T(0)

    减去相似项。

    T(n) = n + T(0) = n + 1。所以这是 O(n)。

    第三个问题:与第一个类似。 T(0) = 1,假设我们知道对于 n-1 的值,您可以看到 T(n) = 1 + 2 T(n/2)。请注意,T(n) = 1 + 2T(n/2)

    所以求解 2T(n/2) + n 并推出递归:

    T(n) = 2 T(n/2) + n

    T(n/2) = 2 T(n/4) + n/2

    所以 T(n) = 4T(n/4) + n + n

    T(n/4) = 2T(n/8) + n/4

    所以 T(n) = 8T(n/8) n + n + n

    ...对于正 k,看起来 T(n) = 2^kT(n/2^k)+kn。

    用归纳法证明。 k = 1: T(n) = 2 T(n/2)+n 给出。这是我们的基本情况。 如果 k-1 为真,则 k 为真:

    T(n) = (2^(k-1))T(n/2^(k-1))+(k-1)n //归纳假设

    T(n/2^(k-1)) = 2 T([n/2^(k-1))]/2)+n/2^(k-1)) //给定递归

    = 2T(n/2^k)+n/2^(k-1)

    => T(n) = (2^k)T(n/2^k)+ n + (k-1)n = (2^k)T(n/2^k) + kn。 k 也是如此。

    T(n) = 2^kT(n/2^k)+kn,选择一个合适的正k,比如k = ln(n)。

    T(n) = 2^ln(n) T(n/2^Ln(n)) + nln(n) = nT(1) +nln(n)。

    T(1) = 1 因为 Proc 刚刚结束。所以 n(T(1)) + nln(n) = nln(n) + n = O(nln(n))。

    不幸的是,对于复杂性,没有一种万能的程序。您必须逐案处理并找出问题所在。

    【讨论】:

    • 在第二种情况下:您写道“这更容易。T(0) = 1 和 T(n) = 1 + T(n-1)。”在你写“T(n) = 1 + T(n-1) T(n-1)”之后是不是?
    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多