用于生成排列的memoization

时间:2011-12-19 16:21:54

标签: algorithm memoization

有没有任何方法可以产生排列的记忆技术。例如  数字1234 ......

对我来说,问题在于它占用了大量内存。有没有办法在一些适度的记忆中

3 个答案:

答案 0 :(得分:0)

对于任何字符串,例如n个不同的字符,n!存在排列,因此所需空间将很大。如果您只需要枚举排列,那么我建议不要存储它们,而是在计算每个排列时直接显示每个排列

答案 1 :(得分:0)

是的,当然,可以使用memoization进行排列生成(几乎任何其他计算,当它有意义时)。具体步骤取决于您的排列生成算法。例如,如果你有一个函数perms(numbers),它接受​​一组数字(比如{1, 2, 3, 4})并通过递归调用返回所有排列的集合(这些数字的有序向量,比如{[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], ...}perms()子集numbers,您可以直接记住此perms()函数。为此,请将缓存创建为映射,其中键是数字集,值是函数调用的结果。

关于你问题的第二部分(关于记忆)。记忆本质上使用大量内存。你总是可以通过使用某种固定大小的缓存来修复这个数量(例如LRU/LFU map),但你应该明白这打破了memoization概念,并且对perms()的一些调用仍将被计算两次或者更多次。

答案 2 :(得分:0)

如果你想连续生成排列并且不需要同时生成排列,那么你可能最好以词典方式迭代它们。编写一个函数nextPerm,它接受​​一个排列并返回next permutation in lexicographic order