【问题标题】:divide and conquer to count the number of good segments分治法计算好段数
【发布时间】:2020-01-30 18:24:23
【问题描述】:

我研究分治法有一段时间了,现在正在研究以下问题:

给定一个长度为 N 的排列 P,计算好段的数量。请注意,N 个整数的序列 A 称为长度为 N 的排列,如果:

   1≤ Ai ≤ N 对于所有 1 ≤ i ≤ N,并且 Ai != Aj 对于所有 1 ≤ i != j ≤ N。

如果 (Pl, Pl+1 , ..., Pr) 也是连续的。也就是说,如果我们将 Pl, Pl+1, ..., Pr 收集到一个新的列表 B 中并对其进行排序,那么这将成立:

   B1 = B2-1, B2 = B3-1, ... , Bi-1 = Bi-1, ..., B|B|-1 = B|B| -1.

例如,在排列[3,2,4,5]中,有8个好的段:

   [3]、[2]、[4]、[5]、[3,2]、[4,5]、[3,2,4] 和 [3,2,4,5]

我分析了组合两个小的分割数组时的几种情况,但我想不出一种策略可以在 O(N) 时间内检测到跨越两个单独数组的好段。

如何做到这一点?

【问题讨论】:

    标签: algorithm divide-and-conquer


    【解决方案1】:

    我个人认为这里不可能以有效的方式应用分而治之。

    您需要检查给定排列的O(n^2) 子字符串。您可以应用分治法,例如将数组分成两半(左右),检查从左半边开始到右半边结束的所有子字符串,然后递归调用左右半边。这将给出:

    n/2 * n/2 = (n/2)^2 = (n^2)/4 1 级的子字符串

    n/4 * n/4 + n/4 * n/4 = 2 * (n/4)^2 = (n^2)/8 2 级的子字符串

    n/8 * n/8 + n/8 * n/8 + n/8 * n/8 + n/8 * n/8 = 4 * (n/8)^2 = (n^2)/16 3 级的子字符串,依此类推

    这会渐近地产生要分析的O(n^2 * log n) 子字符串,如果我们只是迭代处理它们,则比O(n^2) 子字符串更糟糕

    对于大于 2 的子问题的数量,情况并不好:如果我们分成 3 个,复杂度是O(n^2 * log3n),以此类推

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-12
      • 2012-10-28
      • 2013-02-12
      • 2021-03-11
      • 2018-08-12
      • 2013-10-30
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多