如何将递增序列号的流浓缩为一个?

时间:2013-01-10 23:50:55

标签: algorithm sequence sequences

我正在收听一个服务器,它通过序列号向我发送某些消息。我的客户端解析序列号,以便跟踪我们是否得到重复或者是否错过序列号,尽管它通常由包装器对象调用,该包装器对象需要单个增量序列号。不幸的是,这个特定的服务器发送不同的序列号流,仅在每个子流内增量。换句话说,一个更简单的服务器会发送给我:

1,2,3,4,5,7

我只会报告1,2,3,4,5,6,7,并且包装工具会通知丢失了一条消息。不幸的是,这个更复杂的服务器向我发送了类似的内容:

A1,A2,A3,B1,B2,A4,C1,A5,A7

(除了字母实际上也是数字代码,方便)。除了A6之外,上面没有间隙,但由于我需要向包装器对象报告一个数字,我无法报告:

1,2,3,1,2,4,1,5,7

因为这将被错误地解释。因此,我想在我的客户端中将我收到的内容压缩为一个增量数字流。例子

A1,A2,A3,B1,B2,A4,C1,A5,A7

应该真正翻译成这样的东西:

1,2,3,4(因为B1实际上是第4个唯一的消息),5,6,7,8,10(因为9可能是A6,B3,C2或另一个字母-1)

然后这将被错过一条消息(A6)。另一个示例序列:

A1,A2,B1,A7,C1,A8

可以报告为:

1,2,3,8,9,10

因为前三个逻辑上处于有效序列中而没有任何遗漏。然后我们得到A7,这意味着我们错过了4条消息(A3,A4,A5和A6)所以我报告了8,所以包装器可以告诉我。然后C1进来,那很好所以我给它#9,然后A8现在是下一个预期的A所以我给它10。

我很难找到一种创造这种行为的方法。有什么方法可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

对于每个流,请确保该流具有正确的序列。然后,发出您看到的所有有效序列号的计数。伪代码:

function initialize()
    for stream in streams do
        stream = 0
    aggregateSeqno = 0

function process(streamId, seqno)
   if seqno = streams[streamId] then
      streams[streamId] = seqno + 1
      aggregateSeqno = aggregateSeqno + 1
      return aggregateSeqno
   else then
      try to fix streams[streamId] by replying to the server

function main()
   initialize()
   while(server not finished) do
      (streamId, seqno) = receive()
      process(streamId, seqno)