复杂度为 O(n log n) 的分治算法

Posted

技术标签:

【中文标题】复杂度为 O(n log n) 的分治算法【英文标题】:An Divide and conquer algorithm with complexity O(n log n) 【发布时间】:2021-06-22 18:56:47 【问题描述】:

我有两个数字序列 (a1, a2, ... , an) 和 (b1, b2, ... , bn)。对于任何 i, j ∈ [n] 我们说 (ai, bi) 和 (aj, bj ) 一致,如果 ai aj ∧ bi > bj 我可以假设所有数字都是不同的。)否则他们不同意。令 A 为一致的对数,D 为不一致的对数。给出一个算法在 O(n log n) 时间内计算 A - D。

我不知道如何通过分而治之的算法来解决它。有人可以帮我吗?

【问题讨论】:

【参考方案1】:

这个问题可以简化为对序列中inversions的个数进行计数的问题。

首先,将输入重写为单个数组对 (a1, b1), (a2, b2), ... (an, bn),然后按照 a 的升序对这个序列进行排序i 组件。由于数字都是不同的,因此在结果序列中我们有 ai j 当且仅当 i i 分量的结果序列中的反转数,即 i i j。数字 A 等于 n(n - 1)/2 - D,因为每一对要么“同意”,要么“不同意”。

使用基于归并排序的分治算法,可以在 O(n log n) 时间内计算该序列中的倒数,详见this other Q&A。

【讨论】:

以上是关于复杂度为 O(n log n) 的分治算法的主要内容,如果未能解决你的问题,请参考以下文章

设计一个采用 O(n log n) 确定的分治算法

特定分治算法的复杂性

归并排序

算法排序02——归并排序介绍及其在分治算法思想上与快排的区别(含归并代码)

分治算法

分治算法总结(未完结)