取样,无需更换未知组

Sampling without replacement from an unknown set

本文关键字:未知 取样      更新时间:2023-10-16

我必须从一组我称之为S的DFA中均匀地提取DFA(确定性有限自动机(。这似乎是一个简单的问题,但我没有设置S。S 包含所有维度n的 DFA,因此我知道 S 的维度,我可以构建S但我不能,因为它非常大。我还知道集合Sm的维度,例如 S3 是S的子集,S3 包含具有 3 个状态的所有DFA,Sm包含所有具有 m 状态的DFA,其中 m <n。>

我没有集合S,因此我必须模拟均匀采样。此外,我必须在没有更换的情况下进行采样。 我创建了一个集合 D={1,2,3........n},对于我称之为i的每个值,我在D中关联值|硅|/|S|其中 | |指示作为参数的集合中的元素数。即我创建了一个发行版。现在我可以根据这个分布从 D 中提取一个值。通过这种方式,我找到了从中提取单个 DFA 的集合。例如,如果从 D 中提取 4,那么我必须从S4中均匀提取 DFA。

但我的问题是,如何在不替换的情况下从Si(上例中的S4(中采样 DFA?也就是说,如果我之前已经提取了特定的 DFA,那么在下一次采样中,我必须避免该特定的 DFA。 请注意,DFA是一个矩阵,一个表(二维数组(。 还备注,提取特定的DFA意味着为上述表的每个单元格均匀提取{1,.....,k}中的值,其中k是字母表中元素的数量(如果接受或拒绝,您还必须为每个状态提取(。

(我必须在 C++11 中实现,但这无关紧要(

如果我正确理解您的问题,那么简单的解决方案是保留每个采样的 DFA,并在生成新的随机 DFA 时 - 检查它之前是否生成过。我想您的问题是存储它们所需的大量内存。

如果是这样,您可以只保留每个DFA的哈希值 - 例如128位MurmurHash3,并将新生成的DFA的哈希值与存储的哈希值进行比较。