算法用于表达重排序,作为对象移动最小数目(Algorithm for expressing reor

2019-09-17 07:16发布

这个问题出现在物体的阵列(有序集合)的同步。

具体而言,考虑物品的阵列,同步到另一台计算机。 用户移动一个或多个对象,从而重新排列阵列中,在我背后。 当我的程序醒来,我看到新的秩序,我所知道的旧秩序。 我必须更改传输到另一台计算机,再现新订单出现。 下面是一个例子:

index         0    1    2
old order     A    B    C
new order     C    A    B

定义一个举动是一个给定的对象移动到一个给定的新指标。 问题是通过在一个通信链路,发送的移动的最小数目来表达重排序,使得所述另一端可以推断通过取无动于衷对象在旧顺序,并将它们移动到的尚未未使用的索引,在新的剩余移动按顺序从最低指数和涨。 传输的这种方法将是在对象的少数大阵列内移动的情况下非常有效的,移位大量对象的。

不挂断。 让我们继续的例子。 我们有

CANDIDATE 1
Move A to index 1
Move B to index 2
Infer moving C to index 0  (the only place it can go)

需要注意的是需要前两个动作来进行传输。 如果我们不移动b传输到索引2,B将被推断为指数0,我们将与BAC,这是错误的结束。 我们需要传输两个动作。 让我们来看看,如果我们可以做的更好?

CANDIDATE 2
Move C to index 0
Infer moving A to index 1  (the first available index)
Infer moving B to index 2  (the next available index)

在这种情况下,我们得到正确的答案,CAB,只传输一个移动, 移动C到索引0。 候选人2因此比1.候选人更好的有四个以上的候选人,但因为很明显,至少一个举动做任何需要,我们现在可以停止,并宣布候选人2是赢家。

我想我可以通过蛮力做到这一点强行尝试所有可能的候选人,但对于N项的数组有N! (N阶乘)可能的候选人,即使我足够聪明,截断不必要的搜索作为例子,事情可能仍然得到其中可能包含上百个对象的典型阵列相当昂贵。

只是传输整个顺序的溶液是不能接受的,因为,对于兼容性,我需要模拟其他程序的传输。

如果有人可以只记下答案,这将是伟大的,但建议去阅读计算机科学教科书XXX的第n章将是完全可以接受的。 我不知道那些书,因为,我,哎, 只有一名电气工程师。

谢谢!

杰里Krinock

Answer 1:

我认为这个问题可以还原为最长公共子序列 ,只要找到这个共同的序列和发送那些不属于它的移动。 有没有证明最优的,只是我的直觉,所以我可能是错的。 即使我错了,这可能是一个很好的起点,以一些更有趣的算法。



Answer 2:

信息理论为基础的方法

首先,有位序列,比如0对应于“正常秩序”和11个对应于“非正常入境”。 每当有不规则的条目也添加旁边的条目的原始位置。

例如。 假设ABCDE的原始顺序以下情况

ABDEC:001 3 01 2

BCDEA:1 1 0001 0

现在,如果使“移动”的概率为p,该方法需要大致N + N * P *的log(n)比特。

请注意,如果P小0的数量将是高的。 您可以进一步压缩结果:

N *(P *日志(1 /ρ)+(1-P)*日志(1 /(1-P)))+ N * P *的log(n)比特



文章来源: Algorithm for expressing reordering, as minimum number of object moves