【问题标题】:Design a storage algorithm [closed]设计存储算法[关闭]
【发布时间】:2012-10-04 17:56:29
【问题描述】:

这是一个面试破解者的问题-

鉴于您以恒定速率从仪器接收样本,并且您拥有恒定的存储空间,您将如何设计一种存储算法,让我无论何时都能获得具有代表性的数据读数看过了?换句话说,代表系统迄今为止的行为。

我对此一无所知。所以,我正在寻找想法。

【问题讨论】:

  • 这听起来像是一个面试问题,你可以让面试官了解更多细节,这样他就可以确定你是否有收集需求的能力。 “代表性读数”太主观了。

标签: algorithm optimization


【解决方案1】:

假设您有内存来存储k 元素。将内存中的第一个 k 元素存储在一个数组中。现在,当您收到第 n 个元素(其中n > k)时,在1n 之间生成一个随机数r。如果r > k 丢弃nth 元素。否则,将数组中的 rth 元素替换为 nth 元素。

这种方法将确保您的数组在任何阶段都包含k 元素,这些元素是从目前收到的输入元素中统一随机选择的。

证明我们可以通过归纳证明任何阶段的k代表元素都是均匀随机分布的。假设在接收到n-1 元素后,任何元素都以概率k/(n-1) 出现在数组中。

接收到第n个元素后,该元素插入数组的概率=k/n

对于任何其他元素,它在当前迭代中被表示的概率=它在上一次迭代中被表示的概率*它在当前迭代中未被替换的概率

= (k/(n-1)) * (n-1)/n = k/n.

【讨论】:

  • 我已经阅读了很多关于水库采样的解释,这是迄今为止最好的。这可能是非常令人困惑的讨论,您确实已经很好地描述了它。谢谢:)
  • 详细来说,当前迭代没有被替换的概率=第n个元素没有被插入的概率+第n个元素被插入到其他位置的概率=(n-k)/n+k/n * (k-1)/k = (n-1)/n
【解决方案2】:

首先,归功于它所属的地方。我将详细说明而不是替代 krjampani 的方法:非常好和清晰。

还有一点 - 但不是那么小 - 需要调查,从那里我们将找到一个相关的,有些隐藏的问题。

首先让我们注意,我们可以重新制定结果,从另一个角度来看,如果你愿意的话,对于任何给定的时间段,从零到那个时间的时间间隔的点(数据)是(假设:假设是)均匀分布在区间 [1-n] 上,由此得出(所述结果)它们在固定区间 [1-k] 中的相对计数应该是 k/n,大概是最佳方式具有代表性。

我们应该意识到,所有这些都是“统计的”:我们生成随机点来控制存储中较旧的数据替换为较新的数据。因此,所述结果并非精确结果,而是(统计上的)“预期值”。

然而,统计上的“期望值”当然很少是我们实际得到的:它只是概念上无数次再次尝试相同事物的平均值。 来自某个“时间段”的数据在区间 [1-n] 上的实际分布以及它们在 [1-k] 中的相对计数的相关派生值是否可能接近(完美)在这种情况下,期望值取决于我们生成随机数(1 到 n 之间)的方式。如果这真的是随机的,我们将进行蒙特卡洛类型的抽样,从而产生高斯类型的结果分布,即,如果我们一遍又一遍地做同样的事情,围绕均匀分布,实际点分布我们的目标是。作为推论,在我们有大量的点之前,统计分布将保持相当大,这意味着,尽管我们的点分布的“预期值”是完美的(即我们的目标),但在一次性现实我们实际上有一些接近分布的东西并没有那么大。

稍加思考就会很明显,在每次添加之后,没有办法永远拥有。完美的均匀分布,无论我们如何决定用新点替换旧点。因此,我们的目标必须是尽可能地增加预期偏差。

重新表述的问题是:给定一个间隔,您需要在该间隔上放置更多无限制的点,以便它们的分布始终“尽可能接近”均匀。这样做的方法是,对每个点相对于前一个点采用固定的“步长”,其中步长相对于间隔长度 - 并且最好是两个大的素数 - 间隔长度。小数字示例:间隔为 11(在某些单位中:“真实”值很可能是实数,而不是整数),步长取 5;这些步骤是 (k*5)mod11: 0, 5, 10, 4, 9, 3, 8, .. 在我们的例子中,我们有额外的复杂性,即间隔的长度正在变化。我们可能需要调整点生成,例如(我不确定)通过将任何新点放置在原始参数(大小、步长)固定的位置,然后将其位置按比例放大实际的interval-length:interval又是11,每次加1,step=5;点数:0、5*(12/11)、10*(13/11) 等。在我们的例子中,需要整数“槽”来替换(或不替换)存储值,我们将不得不四舍五入到最接近的整数(并且该四舍五入对统计数据的影响可能会导致对点生成器的进一步调整) .我这里没什么了,还有一些事情要解决。

我来到了最后一个隐藏的问题: 在上述所有内容中,我们默认假设均匀采样——在一个区间内平均分配点——是获得代表性结果的最佳方式。大概我们可以将“代表性结果”解释为 - 比如说,我们正在查看特定的测量值 - 在特定时间段内其值的公平平均值。想象要测量的值随着时间的推移表现为某个函数,我们实际上是在查看该函数在时间间隔内的积分(除以间隔长度)。现在,除非随着时间的推移该函数的变化是完全疯狂的,上下跳跃并做各种花哨的事情 - 在这种情况下,所有的赌注都是关闭的,你也可以做任何随机的事情 - (理论上和实践上)已经建立关于如何在一个区间内对(“正常行为”)函数进行采样以获得其积分的“最佳”近似值的方法。随机(蒙特卡洛)确实很糟糕(与样本点数 N 收敛为 1/sqrt(N));均匀采样要好得多(1/N)-在某些特殊情况下非常理想-但两者通常都因在特定多项式的零点采样而相形见绌,其中-除非有病案-您通常将精度提高 0.5 到几个 SIGNIFICANT每增加一个点的数字。

基于以上观点,我们面临的原始问题如下: 我们如何在稳定增加的区间上系统地生成点,以便在任何时候,区间内的点分布都尽可能接近那些特定点的零点分布(取决于您对函数的了解)希望有这样的样本,但在没有任何特定信息的情况下:Legendre)该区间内的多项式(归一化为 [-1:1])。

然后,我的(理论)方法将是使用“恒定步长相对素数间隔”方法,其中 - 除了对间隔增加的事实进行调整外,参见上文 -沿区间的长度测量,用于“计算”步长,由 (Legendre) 多项式的零点的分布(函数)加权。

【讨论】:

  • Bert 提出了一个很好的观点:如果您对数据应该是什么样子没有任何期望,那么获得一个代表性样本是非常困难的。也许 Bert 的 constant-step-over-relatively-prime-interval 是比纯随机替换更好的默认值。
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2013-02-04
  • 2015-08-23
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
相关资源
最近更新 更多