增加数量的完整性比较

时间:2018-05-09 09:05:25

标签: algorithm

服务器不断生成不断增加的数字(不保证是连续的),并且不断地通过不同的http数据包将这些数字发送到客户端。并且数据包可能会丢失(服务器不会存储该号码是否成功发送的状态)。例如:

  

来自服务器的数字:1,3,5,8,14,< 18> ,23,34,56 ......

     

号码客户可能会收到:1,3,5,8,14,<> ,23,34,56 ......

现在,客户端想要确定某个范围内的数字序列是否与服务器一致。例如,客户想要找到丢失的18个。如何使用最少量的数据完成此过程。

例如,客户端请求服务器的start_num = 3,end_num = 34,服务器响应客户端的所有数字都在3到34之间。然后客户端可以比较它们并找到丢失的18。但是,这种方法需要传输太多数据。是否有更好的算法或方法来减少冗余,例如用于纠错的汉明码?

如果数字不断增加会怎么样?

2 个答案:

答案 0 :(得分:0)

做xor数组:

public static void findMissingNumber() {
        int[] numbersFromServer = {1, 3, 5, 8, 14, 18, 23, 34, 56};
        int[] numberClientReceived = {1, 3, 5, 8, 14, 23, 34, 56};
        int xor = 0;
        for (int i = 0; i < numbersFromServer.length; i++) {
            xor ^= numbersFromServer[i];
        }
        for (int i = 0; i < numberClientReceived.length; i++) {
            xor ^= numberClientReceived[i];
        }
        System.out.println(String.format("Missing number: %s", xor));
    }

这是O(n),不需要额外的空间。 还要注意它的工作原理是1^1 = 0。在xoring时,相同的数字给出0,只有丢失的数字不会与任何东西相关。

你的意思是什么?
  

如果数字不断增加会怎么样?

它的1,2,3,4...还有一个丢失了吗?然后,您可以计算完整数组(n*(n+1)/2)的总和以及缺少数字的数组的减去和。

答案 1 :(得分:0)

发送序列中的“下一个”数字,以及前一个数字的增量。这看起来像是:

Received from server
Current number   Delta from previous
1                0
3                2
5                2
8                3
14               6
23               5
34               11
56               22

为了确定是否缺少数字,如此处的情况,接收器将先前的数字和增量相加。如果总和不等于当前接收的数字,则表示缺少数字。因此:

Received from server
Current number   Delta from previous  Delta + previous
1                0                     0 delta = first number received
3                2                     2 +  1 = 3  : OK
5                2                     2 +  3 = 5  : OK
8                3                     3 +  5 = 8  : OK
14               6                     6 +  8 = 14 : OK
23               5                     5 + 14 = 19 : ERROR
34               11                   11 + 23 = 34 : OK
56               22                   22 + 34 = 56 : OK

客户端还可以尝试使用增量来重建列表。在单个丢失号码的情况下,可以从接收的数量减去接收的增量来重建“丢失”号码。在我们的错误案例中,23 - 5 = 18。

如果您可以承受更多的开销,服务器可以“提前”生成一个数字,因此它可以发送前向和后向增量。通过这种方式,客户端可以验证它是否收到了正确的号码,可以从丢失的单个号码中可靠地恢复,并检测是否错过了多个号码。这看起来像是:

Received from server
                                                                       Expected # =
Current number   Back delta   Forward delta   Back delta + previous    Current + fwd delta
1                0            2                0 delta = first # rcvd  1 + 2 = 3
3                2            2                2 +  1 = 3  : OK        3 + 2 = 5
5                2            3                2 +  3 = 5  : OK        5 + 3 = 8
8                3            6                3 +  5 = 8  : OK        8 + 6 = 14
14               6            4                6 +  8 = 14 : OK        14 + 4 = 18
23               5           11                5 + 14 = 19 : ERROR     23 + 11 = 34
34               11          22               11 + 23 = 34 : OK        34 + 22 = 56
56               22          ...              22 + 34 = 56 : OK        ...

希望这有帮助。