0

我试图根据一定的长度生成随机字符串。例如,如果长度 = 4,我生成从 aaaa 到 zzzz 的所有字符串。我需要所有的重复用于稍后的测试目的。这就是我要做的事情:

len = 5
str = ('a'..'z').to_a.repeated_permutation(len).map(&:join)

问题是它占用了大量内存。事实上,我的程序由于 ruby​​ 解释器无法分配足够的内存而终止。是否有一种内存占用较少的方式来生成这些字符串?

编辑: Len 在技术上是一个变量。它的范围可以从 2 到 7。

4

4 回答 4

3

只需使用('aaaaa'..'zzzzz').to_a. 它避免了将每个数字构建为四个字母的数组并将它们连接回字符串的中间步骤。

这(在我的系统上)大约快四倍,而且几乎肯定会使用一小部分内存。

...问题是 len 是一个变量 ....从 2 到 7

然后使用(('a' * len)..('z' * len)).to_a. 这仍然更快,因为唯一的临时分配是由4 到 14 个字符生成'a' * len的字符串。'z' * len

于 2013-03-13T13:28:54.940 回答
0
len = 5
(('a'*len)..('z'*len)).to_a
于 2013-03-13T18:43:34.953 回答
0

减少使用的内存量可以通过使用享元模式来完成。

我不确定您要在解决方案上投入多少时间,但要创建一个包含x许多“字母”的类,这些“字母”按特定顺序排列,并且每个字母都指向一个共享的Strings 池(每个字母一个在字母表中)将允许您降低内存(您可以为此使用哈希)。然后,您可以覆盖to_s用于输出新对象以及修改repeated_permutation方法以接受新对象。

请注意,仅当您期望len变得非常大时,该解决方案才值得您花时间。

于 2013-03-13T13:37:26.950 回答
0

您可以逐个遍历排列 - 取决于您以后是否需要批量处理它们。

因此,如果您可以将字符串逐个输入测试,那么您就可以

enumerator = str = ('a'..'z').to_a.repeated_permutation(len)
my_test( enumerator )

和 。. .

def my_test e
  e.each do |string|
  # Test it
end

不过,这仍然需要处理很多,我希望这样的代码至少需要几分钟才能运行,您正在测试超过 1100 万个单独的字符串。

于 2013-03-13T13:30:17.963 回答