我必须从一组我称之为 S 的DFA中提取均匀的DFA(确定性有限自动机)。这似乎是一个简单的问题,但我没有设置 S 。 S 包含维度 n 的所有DFA,因此我知道 S 的维度,我可以构建 S 但是我不能因为非常大。我也知道集合 Sm 的维度,例如 S3 是 S 的子集,S3包含所有具有3种状态的DFA, Sm 包含具有m个状态的所有DFA,其中m 我没有设置 S ,因此我必须模拟均匀采样。此外,我必须做无需更换的取样。我创建了一个集合D = {1,2,3 ........ n},对于每个值,我称之为我,在 D 我关联值 | Si | / | S | 其中| |表示集合中作为参数的元素数。即我创建了一个发行版。现在我可以根据此分布从D中提取值。通过这种方式,我找到了从中提取单个DFA的集合。例如,如果从D I提取4,那么我必须从 S4 统一提取DFA。 但我的问题是,如何在不更换的情况下从 Si (上例中的 S4 )中抽样DFA?也就是说,如果我之前已经提取了特定的DFA,那么在下一次采样中我必须避免使用特定的DFA。
注意DFA是一个矩阵,一个表(一个二维数组)。
另请注意,提取特定DFA意味着为上述表格的每个单元格均匀地提取{1,.....,k}中的值,其中k是字母表中元素的数量(您还必须提取每个州如果接受或拒绝的话。) (我必须在C ++ 11中实现,但这非常无关紧要)
答案 0 :(得分:2)
如果我正确理解你的问题,那么简单的解决方案就是保留每个采样的DFA,并在生成一个新的随机数时 - 检查它是否已经生成过。我想你的问题是存储它们所需的大量内存。
如果是这样,您可以只保留每个DFA的哈希值 - 例如一个128位的MurmurHash3,并将新生成的DFA的哈希值与存储的哈希值进行比较。