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