此问题出现在对象的数组(有序集)的同步中。
具体来说,考虑与另一台计算机同步的项目数组。用户移动一个或多个对象,从而在我的背后重新排序阵列。当我的程序醒来时,我看到新订单,我知道旧订单。我必须将更改传输到另一台计算机,在那里复制新订单。这是一个例子:
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)
请注意,前两个移动需要传输。如果我们不将 Move B传送到索引2 ,则B将被推断为索引0,并且我们最终会得到B A C,这是错误的。我们需要传递两个动作。让我们看看我们能做得更好......
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)
在这种情况下,我们得到正确的答案,C A B,只传输一个移动,将C移动到索引0 。因此,候选人2优于候选人1.还有四名候选人,但由于显然至少需要一次行动才能做任何事情,我们现在可以停止并宣布候选人2为胜者。
我想我可以通过强行尝试所有可能的候选人来做到这一点,但是对于N个项目的数组,有N! (N阶乘)可能的候选者,即使我足够聪明地截断不必要的搜索,如示例所示,在可能包含数百个对象的典型数组中,事情可能仍然相当昂贵。
仅传输整个订单的解决方案是不可接受的,因为为了兼容性,我需要模拟另一个程序的传输。
如果有人可以写出那个很棒的答案,但建议去阅读计算机科学教科书XXX 的N章将是完全可以接受的。我不知道那些书,因为,我是,嘿,只是电气工程师。
谢谢!
杰瑞克里诺克答案 0 :(得分:0)
我认为问题可以归结为Longest common subsequence problem,只需找到这个共同的子序列并传输不属于它的移动。没有证明最优,只有我的直觉,所以我可能是错的。即使我错了,这可能是一些更精彩的算法的良好起点。
答案 1 :(得分:0)
基于信息理论的方法
首先,有一个比特序列,使得0对应于'常规顺序',11对应于'不规则条目'。每当有不规则的条目时,也要添加下一个条目的原始位置。
EG。假设以下情况下ABCDE的原始顺序
ABDEC:001 3 01 2
BCDEA:1 1 0001 0
现在,如果进行“移动”的概率为p,则此方法需要大约n + n * p * log(n)位。
请注意,如果p很小,则0的数量将会很高。您可以将结果进一步压缩为:
n *(p * log(1 / p)+(1-p)* log(1 /(1-p)))+ n * p * log(n)位