答案 0 :(得分:3)
这不是必要的。交替方向为任何阵列提供O(N)。
让我们计算一个数组M×N的比较次数。
第一次迭代给出3×M,第二次给出3×N / 2,第三次给出3×M / 4,第四次给出3×N / 8,即:
3 * (M + M/4 + M/16 + ...) + 3 * (N/2 + N/8 + N/32 + ...)
我们有两个几何系列。因为这两个系列都有共同比例1/4,我们可以计算出上限:
3 * (4 * M/3 + 2 * N/3)
原因O(const×N)= O(N)和O(M + N)= O(N),我们有O(N)算法。
如果我们总是选择垂直方向,那么算法的性能是O(logM×N)。如果M多了N,那么这个算法会更快。 F.E.如果M = 1025且N = 3,则第一算法中的比较计数与1000相当,而第二算法中的比较计数与30相当。
按最大方向拆分数组,我们得到了针对M和N的特定值的更快算法。这个算法是O(N)吗?是的,因为即使比较每个步骤的垂直和水平部分我们有3×(M + M / 2 + M / 4 + ...)+ 3×(N + N / 2 + N / 4 + ...) = 3 *(2×M + 2×N)比较,即O(M + N)= O(N)。但我们始终只选择一个方向。
答案 1 :(得分:0)
拆分较长的一侧可确保拆分的长度最多为sqrt(区域)。他本可以通过证据注意到每次通话时他的面积减半,并且他会查看大多数3平方(区域)的单元格。