【发布时间】:2013-05-15 07:57:32
【问题描述】:
给定一个迭代器 it 对数据点、我们拥有的数据点数量 n 以及我们想要用于进行某些计算的最大样本数 (maxSamples)。
想象一个函数calculateStatistics(Iterator it, int n, int maxSamples)。该函数应该使用迭代器来检索数据并对检索到的数据元素进行一些(大量)计算。
- 如果
n <= maxSamples我们当然会使用从迭代器中获得的每个元素 - 如果
n > maxSamples,我们将不得不选择要查看哪些元素以及要跳过哪些元素
我在这方面花费了相当长的时间。问题当然是如何选择何时跳过元素以及何时保留它。到目前为止我的方法:
- 我不想获取来自迭代器的第一个
maxSamples,因为这些值可能不会均匀分布。 - 另一个想法是使用随机数生成器,让我在
0和n之间创建maxSamples(不同的)随机数并获取这些位置的元素。但如果例如n = 101和maxSamples = 100越来越难以找到尚未在列表中的新的不同数字,仅在随机数生成中就浪费了大量时间 - 我最后的想法是反其道而行之:生成
n - maxSamples随机数并排除这些位置元素处的数据元素。但这似乎也不是一个很好的解决方案。
你对这个问题有什么好主意吗?可能有标准的已知算法吗?
【问题讨论】:
-
no maxSample 只是我们想要查看多少样本来进行计算的限制
-
嗯,也许我不清楚。你说你不想拿第一个 maxSamples。所以我的问题是你需要随机抽取样本(正如你尝试的那样)还是你可以定期跳过一些样本(例如
n=13、max=9所以你跳过 3、6、9 和 12 th示例)? -
@TonyMorris 对不起,我误会你了。跳过一些样本也是可能的,是的。但是如何选择跳号呢?
-
@ChrisCM 我认为这是一个堆栈溢出问题,但当然不是一个简单的问题!我提出的 3 个解决方案都是不可接受的(否则我不会问),我想我在每个解决方案中都说明了他们的问题是什么。是的,正如您所说:“您可以提出的任何收藏都是可以接受的”,但问题是如何获得该收藏!
-
如果“任何你能想出的集合”是答案,为什么不是前几个?因此很简单,否则你想要真正的伪随机性,这就是我发布答案的原因。尽管您缺乏随机访问权限,但这是唯一的方法。当您实施“跳过”类型的场景时,您注定会多次“接受其余部分”或“忽略其余部分”,这并不比只接受第一批更好。因此,迭代,创建一个临时随机访问向量,并从中随机选择是唯一剩下的答案,因此,我发布的答案。