此重排/排序问题的名称?


10

给您一个长度为的数组。数组的每个元素都属于K类之一。你应该重新排列使用交换操作的最小数量,以使阵列的所有元素相同类总是组合在一起,即它们形成连续的子阵列。 例如: nK
剩下三个有效的安排。

[2,1,3,3,2,2][2,2,2,1,3,3], or[2,1,3,3,2,2][1,2,2,2,3,3], or[2,1,3,3,2,2][3,3,2,2,2,1].

这个问题在文学中被称为什么?是否有一种有效的算法?


1
我不确定这个问题的名字,尽管肯定有可能。并非所有可能的问题都有名称。
Yuval Filmus

2
实际上,这将称为分组。我不了解经典算法中的术语。(这肯定是一个有趣的问题,并且可能是棘手的问题!将交换次数减少到最小的感觉是“找到组的最佳排列”,这反过来又使人感到NP很难。)
拉斐尔

大家好,谢谢您。我当然对解决该问题感兴趣,但认为已经进行了研究,因此希望提供参考。
Marko Bukal

Answers:


6

注意:这是一种硬度证明,我认为有一些实用的算法,例如整数编程等。

由于要收拾BIN_PACKING实例ñ 1... ñ ķ大号的大小的仓1... 大号,并且确保了Σ ñ = Σ Ĵ = ñ,那么我们可以设计您的问题的实例如下:Kn1,,nKLm1,,mLni=mj=N

  • 类别;K+(N+1)(L1)
  • 第一类具有大小Ñ 1... Ñ ķ分别与每个其余的类都有尺寸Ñ + 1 ;;Kn1,,nKN+1
  • 数组被划分为以下大小的插槽: 其中每个大小为N + 1 2被填充有ñ + 1类,连续地布置,其余的是任意地布置。
    m1,(N+1)2,m2,(N+1)2,m3,,(N+1)2,mL
    (N+1)2N+1

现在的主要观察结果是,保持插槽中的至少一个类别不动而移动其他类别是没有意义的(因为这不会改变'bin'的大小)。因此,当且仅当最小交换次数不大于N时,原始垃圾箱包装才可用。由于已知BIN-PACKING具有很强的NP完整性,因此您的问题是NP困难的。(N+1)2N


这很漂亮!如果其他情况也很困难:(1)交换总是足以在大小为m 1m L的插槽中创建我们想要的“箱包装” ,因为单个交换足以将一个元素移至其最终位置位置,而不会干扰已经放置的元素。(2)我们只能尝试使用“ bins”之间的length- N + 1 2个 “缓冲区” 来做两种可能的事情:将整个length- N + 1 类移动到另一端的其他地方(但这种收费ñ + 1Nm1,,mL(N+1)2(N+1)N+1已经交换了,所以我们不能)或将整个事物“向左或向右滑动”(但这需要使每个
事物

...类在缓冲区的左或右一个位置,尽管我们可以通过每个类一次交换来实现,但是该区域中有类,因此至少需要N + 1个交换,因此再次:不可能)。是需要理由是业务方案的问题的解决方案,成本这一点ñ意味着一个有效装箱。(3)由于装箱是强烈 NP完全,通常的“无无”创建多个小工具(这里,数组元素)正比于输入的编码这里不适用:)数字的N+1N+1N
j_random_hacker

1

我也怀疑这是NP难点,但是在没有证明的想法的情况下,这里有几个快速计算的下限,可能对检查启发式解决方案的最优性或修剪分支定界搜索有用。

让class 包含n i个元素。在任何有效的解决方案中,类i必须在位置j处开始。因此,我们可以计算下界大号的“固定”的类的成本通过尝试所有可能的开始位置Ĵ,计数非数量在长度-元素Ñ 块中的位置开始Ĵ(每个这些位置中的将需要交换),并采用最小值。这个大号可以计算任何ø Ñ iniijLiijinijLiiO(n)使用滑动窗口方法的总时间为时间。那么,两个总体下界是:O(Kn)

  1. 对所有取最大值。K = 2时紧,对于大K可能很弱。LiK=2K
  2. 将所有求和,然后除以2,四舍五入。这是有效的,因为任何交换最多可以修复2个错误的位置。Li

在您的示例中,这些边界都给出1(在后一种情况下,可以四舍五入为0.5),这当然是宽松的。

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.