Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将重排序表示为对象移动的最小次数的算法_Algorithm_Synchronization - Fatal编程技术网

Algorithm 将重排序表示为对象移动的最小次数的算法

Algorithm 将重排序表示为对象移动的最小次数的算法,algorithm,synchronization,Algorithm,Synchronization,这个问题出现在有序对象集的数组同步中 具体地,考虑一组项目,与另一台计算机同步。用户在我背后移动一个或多个对象,从而重新排列阵列。当我的程序醒来时,我看到新的顺序,我知道旧的顺序。我必须将更改传送到另一台计算机,在那里复制新订单。下面是一个例子: index 0 1 2 old order A B C new order C A B 将移动定义为将给定对象移动到给定的新索引。问题是通过在通信链路上传输最小数量的移动来表示重新排

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

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

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,我们将以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)
在这种情况下,我们得到了正确的答案,cab,只传送一个移动,移动C到索引0。因此,候选人2优于候选人1。还有四位候选人,但很明显,做任何事情都至少需要一个步骤,我们现在可以停下来宣布候选人2获胜

我想我可以通过暴力地尝试所有可能的候选项来做到这一点,但是对于N个项目的数组,有N个!N个阶乘可能的候选者,即使我足够聪明,可以像示例中那样截断不必要的搜索,在一个可能包含数百个对象的典型数组中,事情可能仍然会变得非常昂贵

仅仅传输整个订单的解决方案是不可接受的,因为为了兼容性,我需要模拟另一个程序的传输

如果有人能写下答案,那就太好了,但是建议去读计算机科学教科书XXX的第N章是可以接受的。我不知道那些书,因为,嘿,我只是个电气工程师

谢谢


Jerry Krinock

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

基于信息论的方法

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

在下列情况下,假设ABCDE的原始顺序

阿卜杜勒:001 3 01 2

BCDEA:110010

现在,如果进行“移动”的概率为p,则此方法大约需要n+n*p*logn位

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


n*p*log1/p+1-p*log1/1-p+n*p*logn位更精确地定义移动。当将对象从位置i移动到位置j时,j处的对象会发生什么情况?ElKamina OP已经解释了这一点;所有未被明确移动的对象都会按照其原始顺序重新定位到不是任何明确移动目标的位置。我转移到了另一个问题上,因此我还没有对此进行测试,但在纸上做了一些思考,并同意这是有意义的。一开始,我觉得最长的公共子序列不必是连续的,但现在我明白了这并不重要。我们正在消除这两种排序中的共性,实际上这与文件扩散非常类似,这就是LCS算法的用途。谢谢,谢谢,但我不能学这个例子。我看到,在第一种情况下,AB产生00。如果你的意思是1对应“不规则输入”,那么我理解13。但是我又迷路了。我认为答案应该是001 3 1 4 1 2,因为最后三个符号DEC都是不规则的。但是,更重要的是,我不知道我将如何处理这些序列,以及它们如何与最小化要传输的信息相关。也许我没有学到足够的信息理论。无论如何,谢谢。12月的“德”仍然是固定的。这就是为什么有一个0。说到信息缩减,编码每个字母需要logn位,如果要传输整个字符串,则需要nlogn位。如果您的案例'Move'中的错误率是恒定的,那么您所能做的就是将logn部分减少到更小的值,这就是我在这里尝试做的。如果你 假设“Move”的数量不变,而不管字符串的大小,您可以做得更好,并可能在恒定的空间中对整个字符串进行编码。