我正在解决一个问题,我认为这个问题会减少到以下内容,并希望找到能够以高效内存方式解决问题的数据结构或算法。
说你正在阅读序列号的(无限)蒸汽。有些生产者连续不停地向这个流中发送数字,而你从另一端读取它们。但是有一些问题。
1。)这个系统有一些本质上不可靠的东西。流或生产者或中间的某个东西可以丢弃一个数据,因此数字可能不会出现在消费者身上,总体上存在任何给定数字可能丢失的(未知)概率N
。
2。)流不能完美保证订单。为了论证,我们假设有一些(众所周知的)常量x
,如果你从流中读取一个数字y < x - N
,你就可以确定你永远不会看到一个数字在该点之后来自流的N
。
也就是说,数字序列只能是p
值&#34;无序&#34;在任何时候。
我非常想在这种情况下识别p
。或者{{1}}的合理估计是最重要的。
我很欣赏任何有助于以内存效率方式解决此问题的相关数据结构或算法的引用。一些简短的伪代码也会有所帮助。谢谢!
编辑:通过内存效率我的意思是我希望能够解决这个问题,而不必使用O(N)内存,其中N是我从流中读取的条目数。 / p>
答案 0 :(得分:0)
直截了当的方法如下。
假设你听了很长时间的流,你读到的最后一个数字是x
。然后你知道,x-N
已经收到的所有数字都会丢失。如果您存储了收到的所有号码,您可以轻松找到已经实际收到的x-N
以下的号码数量;让我们说你实际收到了A
个号码。而且你肯定知道 * 你期待接收的数量少于x-N
,让我们说你期待收到{{1}数字。这两个值B
的比率将为您提供A/B
的良好估算值。
* 这取决于您是否知道应该收到的第一个号码。例如,如果您知道序列从p
开始,那么您应该预期0
个数字。如果您不知道起始号码,可以通过收到第一个号码B=x-N
,并仅考虑z
和{{1}之间的数字来限制它与上述内容类似}。
为了能够找到z+N
,您可以使用许多数据结构。二叉搜索树是一个显而易见的选择。或者您只能存储收到的总数和收到的x-N
最大数字,因此BST也是一个不错的选择。