java - 从未知大小的输入读取数据子集 : memory usage with particular syntax.(水库采样)

标签 java memory sampling

写下这个:

N = args[1].split("\\s+").length;

使用命令行参数,例如:echo "A B C D E F G H I"| java Subset 3 ,这是否会消耗与使用 .split()"A B C D E F G H I" 字符串解析为字符串数组时类似的内存?

我的任务规定(作为挑战)学​​生(我)可以尝试从 N 个字符串(上面的 N = 9 ,A 到 I)中均匀随机地均匀显示 K 个字符串(上面的命令行中的 K = 3) )输入,同时消耗的内存与 K 成正比,而不是 N。 这基本上就是我想要做的。

编辑: mvp 的回答很有帮助。现在更好地理解问题了。

但我觉得我应该补充一点,我只允许使用这个:

私有(private)静态扫描仪扫描仪 = new Scanner(new BufferedInputStream(System.in), charsetName);

我不能自己使用 Scanner 类,或者 BufferedReader 。鉴于此限制,我有点不确定如何继续。

最佳答案

对于未知长度的输入数据流(即,我们仅在 EOF 处停止,并且不关心 N 是什么),可以解决这个问题,并且将使用与 K 成比例的内存。

首先,让我们求解 K=1。如果我们开始读取输入流,我们应该假设第一项(示例中的 A)应该是我们的答案 - 因为如果没有输入,那就一定是它。当我们阅读第二项时,我们应该考虑将其作为我们的答案,而不是概率为 A 的 1/2 。当我们读到第三项C时,我们应该以概率1/3取它。 , 等等。该算法将从输入流中随机选择 1 个项目,而无需预先知道项目的数量(每个项目将有相同的被选择概率)。

对于 K=2、K=3(或更多),我们采用类似的方法。例如,对于 K=3,读取 3 项 A , B , C并用它们作为答案。当我们读取第 4 项时,我们应该以 3/4 的概率选择它。 (K/N) 并用它以相等的概率 1/3 替换 Activity 项目之一。然后继续这样做,直到输入流的EOF,最后打印3个 Activity 项。

关于java - 从未知大小的输入读取数据子集 : memory usage with particular syntax.(水库采样),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18554947/

相关文章:

java - 如何在java中使用SetWindowsHookEx函数?

c++ - 如何将一个 vector block 复制到另一个

java - Android:当 SAMPLERATE 设置为 44100 时,startRecording() 在未初始化的 AudioRecord 上调用

audio - 数字音频格式

java - 为 2 个数组赋值和对象 - Java

java - VisualVM 中的美元符号

java - 在具有操作和鼠标监听器的 GUI 中,未为 JTable 触发 MouseClicked

iphone - 如何使用iPhone的崩溃报告查找问题?

tensorflow - 反向传播的内存要求——为什么不使用均值激活?

verilog - 将 14 位字缩放为 8 位字