trominoes 算法的复杂度
Complexity of trominoes algorithm
(分而治之)trominoes 算法的复杂性是什么或应该是什么?为什么?
我得到了一块 2^k * 2^k 大小的木板,其中一块瓷砖被随机移除,使其成为一块有缺陷的木板。任务是用 "trominos" 填充,这是一个由 3 个方块组成的 L 形图形。
平铺问题
– 输入:一个 n x n 的方板,其中一个是 1 x 1 的方块
缺失,其中 n = 2k 对于某些 k ≥ 1。
– 输出:使用 tromino 的棋盘平铺,三方块
通过从 2 x 2 中删除右上角 1 x 1 获得
正方形。
– 您可以旋转 tromino 来平铺棋盘。
基本情况:可以平铺一个 2 x 2 的正方形。
归纳:
– 将正方形分成 4,n/2 除以 n/2 个正方形。
– 将 tromino 放在“中心”,而 tromino 没有
将 n/2 与 n/2 正方形重叠,之前 1 乘 1 地漏掉了
正方形。
– 通过 n/2 板归纳地解决四个 n/2 中的每一个。
该算法运行时间为 O(n2) = O(4k)。要了解原因,请注意您的算法对每个网格的工作时间为 O(1),然后对宽度和高度为原始大小一半的网格进行四次子调用。如果我们用n作为参数表示网格的宽度或高度,我们有以下递推关系:
T(n) = 4T(n / 2) + O(1)
根据主定理,这求解为 O(n2)。由于n = 2k,我们看到n2 = 4k,所以这也是O (4k)如果你想使用k作为你的参数。
我们也可以让 N 表示棋盘上的方块总数(因此 N = n2),在这种情况下,子调用是四个大小为 N /每个 4 个。这给出了重复
S(N) = 4S(N / 4) + O(1)
这求解为 O(N) = O(n2),证实了上述结果。
希望对您有所帮助!
据我了解,复杂度可以按如下方式确定。令 T(n)
表示求解边长 n
的木板所需的步数。根据上面原始问题的描述,我们有
T(2) = c
其中 c
是常数,
T(n) = 4*T(n/2) + b
其中 b
是放置 tromino 的常量。使用 master theorem,运行时绑定是
O(n^2)
通过案例 1。
我将尝试提供不太正式的解决方案,但不使用主定理。
– Place the tromino at the “center”, where the tromino does not overlap the n/2 by n/2 square which was earlier missing out 1 by 1 square.
我猜这是一个 O(1)
操作?在这种情况下,如果 n
是棋盘大小:
T(1) = O(1)
T(n) = 4T(n / 4) + O(1) =
= 4(4T(n / 4^2) + O(1)) + O(1) =
= 4^2T(n / 4^2) + 4*O(1) + O(1) =
= ... =
= 4^kT(n / 4^k) + 4^(k - 1)*O(1)
但是n = 2^k x 2^k = 2^(2k) = (2^2)^k = 4^k
,所以整个算法就是O(n)
.
请注意,这与@Codor 的回答并不矛盾,因为他将 n
视为板的边长,而我将其视为整个区域。
如果中间步骤不是O(1)
而是O(n)
:
T(n) = 4T(n / 4) + O(n) =
= 4(4*T(n / 4^2) + O(n / 4)) + O(n) =
= 4^2T(n / 4^2) + 2*O(n) =
= ... =
= 4^kT(n / 4^k) + k*O(n)
我们有:
k*O(n) = n log n because 4^k = n
所以整个算法就是O(n log n)
。
每放置一个 tromino,你需要做 O(1) 的工作。由于要放置 (n^2-1)/3 个 trominos,因此该算法需要 O(n^2) 时间。
(分而治之)trominoes 算法的复杂性是什么或应该是什么?为什么?
我得到了一块 2^k * 2^k 大小的木板,其中一块瓷砖被随机移除,使其成为一块有缺陷的木板。任务是用 "trominos" 填充,这是一个由 3 个方块组成的 L 形图形。
平铺问题
– 输入:一个 n x n 的方板,其中一个是 1 x 1 的方块 缺失,其中 n = 2k 对于某些 k ≥ 1。
– 输出:使用 tromino 的棋盘平铺,三方块 通过从 2 x 2 中删除右上角 1 x 1 获得 正方形。
– 您可以旋转 tromino 来平铺棋盘。 基本情况:可以平铺一个 2 x 2 的正方形。
归纳:
– 将正方形分成 4,n/2 除以 n/2 个正方形。
– 将 tromino 放在“中心”,而 tromino 没有 将 n/2 与 n/2 正方形重叠,之前 1 乘 1 地漏掉了 正方形。
– 通过 n/2 板归纳地解决四个 n/2 中的每一个。
该算法运行时间为 O(n2) = O(4k)。要了解原因,请注意您的算法对每个网格的工作时间为 O(1),然后对宽度和高度为原始大小一半的网格进行四次子调用。如果我们用n作为参数表示网格的宽度或高度,我们有以下递推关系:
T(n) = 4T(n / 2) + O(1)
根据主定理,这求解为 O(n2)。由于n = 2k,我们看到n2 = 4k,所以这也是O (4k)如果你想使用k作为你的参数。
我们也可以让 N 表示棋盘上的方块总数(因此 N = n2),在这种情况下,子调用是四个大小为 N /每个 4 个。这给出了重复
S(N) = 4S(N / 4) + O(1)
这求解为 O(N) = O(n2),证实了上述结果。
希望对您有所帮助!
据我了解,复杂度可以按如下方式确定。令 T(n)
表示求解边长 n
的木板所需的步数。根据上面原始问题的描述,我们有
T(2) = c
其中 c
是常数,
T(n) = 4*T(n/2) + b
其中 b
是放置 tromino 的常量。使用 master theorem,运行时绑定是
O(n^2)
通过案例 1。
我将尝试提供不太正式的解决方案,但不使用主定理。
– Place the tromino at the “center”, where the tromino does not overlap the n/2 by n/2 square which was earlier missing out 1 by 1 square.
我猜这是一个 O(1)
操作?在这种情况下,如果 n
是棋盘大小:
T(1) = O(1)
T(n) = 4T(n / 4) + O(1) =
= 4(4T(n / 4^2) + O(1)) + O(1) =
= 4^2T(n / 4^2) + 4*O(1) + O(1) =
= ... =
= 4^kT(n / 4^k) + 4^(k - 1)*O(1)
但是n = 2^k x 2^k = 2^(2k) = (2^2)^k = 4^k
,所以整个算法就是O(n)
.
请注意,这与@Codor 的回答并不矛盾,因为他将 n
视为板的边长,而我将其视为整个区域。
如果中间步骤不是O(1)
而是O(n)
:
T(n) = 4T(n / 4) + O(n) =
= 4(4*T(n / 4^2) + O(n / 4)) + O(n) =
= 4^2T(n / 4^2) + 2*O(n) =
= ... =
= 4^kT(n / 4^k) + k*O(n)
我们有:
k*O(n) = n log n because 4^k = n
所以整个算法就是O(n log n)
。
每放置一个 tromino,你需要做 O(1) 的工作。由于要放置 (n^2-1)/3 个 trominos,因此该算法需要 O(n^2) 时间。