服务器不断生成不断增加的数字(不保证是连续的),并且不断地通过不同的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。但是,这种方法需要传输太多数据。是否有更好的算法或方法来减少冗余,例如用于纠错的汉明码?
如果数字不断增加会怎么样?
答案 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 ...
希望这有帮助。