这篇文章错误地回答了一个问题的变体,即允许在A中交换两个元素。我认为我会把它留下来,因为我已经在上面工作了。
以下是改进的一般可能性。我们可以看到当我们要交换的一对具有相反的顺序时(例如,如果a1 < b1
,则a2 > b2
,反之亦然),改进就会发生。更仔细地观察,我们可以看到最佳候选交换具有与第一对重叠最大的区间。
我们可以通过首先按其较低元素对所有给定的对进行排序,然后按较低元素的降序处理它们来拥有一个O(n log n)
例程。当我们下降时,为a < b
的对保留一个顺序统计树,为b ≤ a
的对保留另一个顺序统计树。按每对的较高元素对树进行排序,并保持两个装饰:(1)左子树中看到的最大区间,以及(2)左子树中看到的最低较低元素。
对于每个处理的元素,选择两棵相反树中具有相等或更低高度元素和最大区间(对应第一棵树装饰)的一对,以及具有高于或等于高度元素和最低下限元素(对应第二棵树装饰)的一对之间的较大重叠。
(由于我们按low
的降序处理一对,所以看到的low
将始终等于或高于当前元素。)
(1)
Original:
a1-----------b1
a2----b2
Total: -----------+----
Swapped:
a1--------------------b2
b1-a2
Total: --------------------+-
Result: worse.
(2)
Original:
a1-----------b1
b2----a2
Total: -----------+----
Swapped:
a1--------------b2
b1-------a2
Total: --------------+-------
Result: worse.
(3)
Original:
a1-----------b1
a2------b2
Total: -----------+------
Swapped:
a1--------------b2
a2---b1
Total: --------------+---
Result: the same.
(4)
Original:
a1-----------b1
b2------a2
Total: -----------+------
Swapped:
a1------b2
b1-a2
Total: ------+-
Result: BETTER.
Improvement: 2 * dist(b2, b1)
(5)
Original:
a1--------------b1
a2----b2
Total: --------------+----
Swapped:
a1----------b2
a2--------b1
Total: ----------+--------
Result: the same.
(6)
Original:
a1--------------b1
b2----a2
Total: --------------+----
Swapped:
a1----b2
a2--b1
Total: ----+--
Result: BETTER.
Improvement: 2 * dist(b2, a2)
(7)
Original:
a1--------------b1
b2--------a2
Total: --------------+--------
Swapped:
b2----a1
a2--------b1
Total: ----+--------
Result: BETTER.
Improvement: 2 * dist(a1, a2)
(8)
Original:
a1-----------b1
b2-------------------a2
Total: -----------+-------------------
Swapped:
b2--a1
b1--a2
Total: --+--
Result: BETTER.
Improvement: 2 * dist(a1, b1)
nlogn
。会考虑是否可能为n
。 - Shridhar R Kulkarni