【问题标题】:algorithm complexity of pseudo code伪代码的算法复杂度
【发布时间】:2013-09-18 05:11:23
【问题描述】:

这是一个将十进制数字转换为二进制表示的函数的伪代码。

问题是证明一个 n 位数的 Ldiv2[A] 是 O(n)。 并确定算法的运行复杂度

输入是数字 X 的十进制表示,由数字数组 A[n-1],...,

以下算法使用“长除以二”过程 Ldiv2 将十进制数除以 2。下面的二进制转换算法将十进制数字数组 A[0..n-1] 转换为位数组 B [0, ..4n-1] 如下:

Initialize B[0, ..4n-1] array of bits,
For i = 0 to 4n-1 do:
    Begin
    B[i]= A[0] %2;   // % is the mod;
    A = Ldiv2[A];
    End;
Return B (possibly removing initial 0’s)

所以对于上面的例子X=169, n=2, B[0] = A[0]%2 = 9%2=1, 那么A=Ldiv2[A] = 84, B[1]=A [0]%2 = 4%2=0 等

对于 Ldiv2[A],我将 4n-1 放入 n > 1 以便根据定义应该是 O(n) 对于算法的运行复杂度,我也认为它是 O(n),因为它只有一个从 0 到 4n -1 运行的 for 循环,虽然有点不清楚是否有证据。

【问题讨论】:

  • A 未在任何地方定义...
  • 这就是作为伪代码提供的全部内容。
  • Ldiv2到底是什么?
  • 那么提供的问题缺少重要的输入!
  • 我编辑了问题以包含更多给定的信息

标签: algorithm for-loop complexity-theory


【解决方案1】:

我们循环运行4n-1 次,每次执行一个动作,在开头O(n)O(1) 结束(当A 变为1 时)。

所以我们得到:

(4n-1)*(n/log(n)) = O(n^2/log(n))

【讨论】:

  • 嗯。 . .好的,我现在开始有点理解了
  • 长除法会遍历每个数字并执行 O(1) 次操作(包括“结转”),因此对于具有n 位数。
  • @alfasin A 是代表数字的数字数组。如果考虑的数字是 1024,则 A[0] = 1,A[1] = 0,A[3] = 2,A[4] = 4。因此,在 for 循环中,Ldiv2[A] 得到一个输入有一个数字。因此,根据您的说法,它应该是 O(1)。为什么开头是O(n),结尾是O(1)?
  • @alfasin 我认为你是对的 Ldiv2(A) 会更好写
  • @user2321926 没有减少两位数,但我认为你明白了。假设存储在 A 中的数字由x 标记。并说2^n 是最接近x 的数字,它也大于x。其中,log(x) = n(以 2 为底的日志)。换句话说,我们需要n 将 x 除以 2 的步骤,然后再将结果除以 2 ...直到我们达到 1。
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 2018-03-16
  • 2022-01-19
  • 1970-01-01
  • 2022-01-19
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多