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