我正在开发一种算法来重新排序传输中的数据包。每个数据包在[0,256]中都有一个相关的序列号。第一个数据包的序列号可以取这些值中的任何一个,之后下一个数据包取下一个值,下一个数据包取后面的值,依此类推(在255之后滚动)。
数据包的序列号按正确顺序显示如下,其中“n”是第一个数据包的序列号:
n,n + 1,n + 2,...,254,255,0,1,2,...,254,255,0,1,2,...,254,255,0 ,1,......
每个数据包在到达目的地时都会得到一个时间戳,并且它们都按顺序到达。 (我没有确切的数字,但是根据到达时间戳排序的数据包列表,可以肯定地说,数据包永远不会超过其序列号所指示的列表中的位置五个点。)
鉴于电信的普及及其对计算机科学发展的历史重要性,我觉得我不可能成为第一个处理这类问题的人。我的问题是:
在给定循环变化的密钥的情况下,是否有一个众所周知的算法来重新排序近似有序的序列,例如上面描述的序列?
此算法的变体是否能够容忍大块缺失项?让我们假设这些块可以是任意长度。我特别担心256个或更多遗失物品。
我对第一种算法有一些想法,但对第二种算法没有。然而,在我投入工时来验证我的算法是否正确之前,我想确保贝尔实验室(或其他任何地方)的某个人在三十年前还没有做到这一点。
答案 0 :(得分:1)
有趣的问题!
我的解决方案是根据到达时间对数据包进行排序,并根据数据包编号循环地对元素窗口(例如10)进行局部排序。您可以通过多种方式对其进行优化。如果两个连续数据包号码之间的差异(根据到达时间排列)大于某个阈值,则可能会在它们之间设置障碍(即,您无法对障碍进行排序)。此外,如果数据包之间的时差(根据到达时间排列)大于某个阈值,您可能想要设置障碍(这可能应该解决问题2)。
答案 1 :(得分:1)
我不知道这个解决方案是否实际用于任何地方,但这是我会尝试的(假设没有丢失数据包,最多“拖曳”五个位置,最大序列号为255):
n = 0;
max_heap h = empty;
while( true ) do
while( h.top().index != 0 ) do
p = next_packet;
i = n - p.seq;
if( i > 0 ) i = i - 255;
h.add( i, p );
done
p = h.pop();
n = n + 1;
p.increase_indexes( 1 );
// Do something with it
done
基本上在优先级队列中,我们存储最后处理的数据包与仍在等待处理的数据包之间有多少数据包。队列将保持非常小,因为数据包会在它们进入时尽快处理。同时增加密钥将非常简单,因为不需要重新排序堆。
我不知道你怎么能把它改成丢失的数据包。最有可能的方法是使用一些超时或最大偏移量,然后将packtets声明为“next”并相应地更新堆。
但是,如果您错过超过256个数据包,我认为这个问题根本不可能。采取后续步骤
127,130,128,129
这可能有几个原因
1)数据包128和129出现故障,应重新排序
2)数据包128和129丢失,然后丢失了253个包,所以订单是正确的
3)1和2的混合物
答案 2 :(得分:0)
使用优先级队列。
每次收到每个包后:
关于第二个问题: