有效地插入到列表中,以最小化反转次数


15

假定两个可比较项的列表:u和s。令INV(u)为u中的求逆数。

我正在寻找一种有效的算法,以在不增加INV(u)的情况下将s的项插入u中。

基本上,我想将对象插入列表,同时保持“尽可能排序”,同时保持第一个列表的顺序。

例:

u = [4,6,2,9,7]
INV(u) = 3 ((4, 2), (6, 2) and (9, 7)

s = [8,3,10]

one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7))

different optimal solution u' = [3, 4, 6, 2, 9, 7, 8, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (9,8))

如您所见,没有独特的最佳解决方案。

对于任何想法或方向,我都会感到高兴。


值得深思的是:天真的方法是:从s中取一个元素,从左到右与u中的每个元素进行比较,如果是倒数,则递增,并携带先前计算的数字。然后使用相同的元素从右到左遍历列表,增加每个位置的计数。它在O(| s | * | u |)中以空格= O(| u |)
trevore

1
检查所有最大递增子序列可能会导致某个地方。
拉斐尔

Answers:


2

这是对trevore答案的详细说明。该评论太长,无法包含评论,其中包含他的解决方案的证明(或者至少是我的理解)。

您可以证明,在任何最佳解中,的元素都将显示为有序。s如果不是,则假设并且它们在最佳解决方案中以相反的顺序出现。让σ 1是间元件的数目小号1s ^ 2是小于小号1β 1是那些比更大的数量小号1。限定σ 2β 2类似地对于小号2。需要注意的是σ 1s1<s2σ1s1s2s1β1s1σ2β2s2 β 2β 1。交换 s 1σ1σ2β2β1s1将通过改变倒位数- β 1 + β 2 - σ 2 + σ 1 - 1,其为至多-1。s2β1+β2σ2+σ11

不难看出元素可以独立插入。s由于的元素看起来是有序的,因此它们不会“感觉”彼此的存在。也就是说,来自元素对对反转计数没有贡献。为此,最好在线性时间内插入s的中值。然后,递归地将s的元素小于中位数的左侧插入中值,并将元素大于中位数的右侧插入。ssss

让中位数插入位置,则此运行时间满足T | s || u |= T | s | / 2 | u |k + T | s | / 2 k + | ü | + | s | ,线性| s |kT(|s|,|u|)=T(|s|/2,|u|k)+T(|s|/2,k)+|u|+|s||s|因素是找到的中位数并改组s的元素。通过归纳很容易表明T | s || u |= O | s | log | s | + | u | log | s |sT(|s|,|u|)=O(|s|log|s|+|u|log|s|)

注意对的依赖 s | 这是最佳的。由于用空u解决问题等同于仅使用比较对s排序。对|的依赖 ü | 也是最佳的,因为单例列表s和列表u的问题必须要求线性工作。|s|us|u|su


感谢您的阐述。那正是我的意思。
trevore

1

好的,这是我的解决方案:

一种观察(我或多或少证明了)是,最优解将始终是s递增排序的最优解。这产生了O((| u | + | s |)* log(| s |))算法。

要找到单个元素的最佳解决方案,请按照我在评论中所说的那样进行操作:从s中取一个元素,从左到右将其与u中的每个元素进行比较,增加一个计数器是一个取反,然后将先前计算出的数字取过来。然后使用相同的元素从右到左遍历列表,增加每个位置的计数。

这是O(| u |)。

排序s。

对于s在位置m处的中间元素:在u中找到最佳位置b(使用上面的方法)。

在m处拆分s并在b处拆分u,并用左右部分递归调用,将结果与m按右顺序连接。

u或s为空时立即停止。


我不明白 s是输入。您不能假设s是排序的。您的算法必须适用于s的所有可能值。
DW

是的,但是在任何最佳解决方案中,s的元素总是最终会在新数组中升序排序。注意步骤“排序s”。请参阅上面的示例。到目前为止,我证明的是:对于a中的b,如果a最优地放置在u中,则a <b,则b的最佳位置在a的右边。
trevore
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.