1

这个问题出现在对象数组(有序集)的同步中。

具体来说,考虑一组项目,同步到另一台计算机。用户在我背后移动一个或多个对象,从而重新排列数组。当我的程序唤醒时,我看到了新的顺序,我知道了旧的顺序。我必须将更改传输到另一台计算机,在那里复制新订单。这是一个例子:

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,我们最终会得到 BAC,这是错误的。我们需要传递两个动作。让我们看看我们是否可以做得更好……</p>

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 章是完全可以接受的。我不知道那些书,因为,我,嘿,只是一名电气工程师。

谢谢!

杰里·克里诺克

4

2 回答 2

0

我认为这个问题可以归结为最长公共子序列问题,只需找到这个公共子序列并传输不属于它的移动。没有最优性的证明,只是我的直觉,所以我可能是错的。即使我错了,这可能是一些更花哨的算法的一个很好的起点。

于 2012-05-17T07:31:30.527 回答
0

基于信息论的方法

首先,有一个位系列,0 对应于“常规顺序”,11 对应于“不规则条目”。每当出现不规则条目时,还要添加下一个条目的原始位置。

例如。对于以下情况,假设 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) 位

于 2012-05-17T18:51:27.777 回答