Algorithm 通过识别序列中的间隙来测试流的可靠性

Algorithm 通过识别序列中的间隙来测试流的可靠性,algorithm,data-structures,stream,gaps-and-islands,Algorithm,Data Structures,Stream,Gaps And Islands,我正在研究一个问题,我认为它可以简化为以下内容,并希望找到数据结构或算法,能够以高效的方式解决它 假设你正在阅读(无限)序列号。一些制作人连续地向这个流中发送数字,没有重复,你从另一端读取它们。然而,有几个问题 1.)该系统存在固有的不可靠性。流或生产者或两者之间的某个东西都可以删除一段数据,因此数字可能不会出现在消费者面前,并且总的来说,任何给定的数字都可能丢失(未知)的概率p 2.)流不能完全保证秩序。为了便于论证,假设有一个(众所周知的)常数N,如果你从流中读取一个数字x,你可以确定,在该

我正在研究一个问题,我认为它可以简化为以下内容,并希望找到数据结构或算法,能够以高效的方式解决它

假设你正在阅读(无限)序列号。一些制作人连续地向这个流中发送数字,没有重复,你从另一端读取它们。然而,有几个问题

1.)该系统存在固有的不可靠性。流或生产者或两者之间的某个东西都可以删除一段数据,因此数字可能不会出现在消费者面前,并且总的来说,任何给定的数字都可能丢失(未知)的概率
p

2.)流不能完全保证秩序。为了便于论证,假设有一个(众所周知的)常数
N
,如果你从流中读取一个数字
x
,你可以确定,在该点之后,你永远不会从流中看到一个数字
y

也就是说,数字序列在任何时候都只能是
N
值“无序”

在这种情况下,我很想确定
p
。或者对
p
的合理估计才是最重要的

我希望能参考相关的数据结构或算法,以高效的方式解决这个问题。一些简短的伪代码也会有帮助。谢谢


编辑:我的意思是,我希望能够解决这个问题,而不必使用O(N)内存,其中N是我从流中读取的条目数。

一个简单的方法可以如下所示

假设您监听该流足够长的时间,最后读取的数字是
x
。然后您知道,所有小于
x-N
的数字要么已经收到要么丢失。如果您存储所有收到的号码,您可以很容易地找到您实际收到的少于
x-N
的号码数量;假设您实际收到了
A
号码。而且你肯定知道*你期望收到的小于
x-N
的数字有多少,比如说你期望收到
B
的数字。这两个值的比率,
A/B
,将为您提供一个很好的
p
估计值

*这取决于你是否知道你应该收到的第一个号码。例如,如果您知道序列从
0
开始,那么您应该期望
B=x-N
数字。如果您不知道起始号码,您可以将其限制为与我上面描述的类似,方法是取收到的第一个号码
z
,只考虑
z+N
x-N
之间的号码



为了能够找到
A
,可以使用许多数据结构。二叉搜索树是一个明显的选择。或者,您只能存储收到的总数量和有史以来收到的最大数量,对于这一点,BST也是一个不错的选择。

我确实发现了类似的问题(),但我不确定如何使用无序问题。您想仅根据此描述对
p
做出合理的估计吗?或者您想根据接收到的数据样本确定
p
的值?@JimMischel通过对数据进行采样;我不相信你能仅凭我所说的来估计p。不过,这将令人印象深刻。