有没有任何方法可以产生排列的记忆技术。例如 数字1234 ......
对我来说,问题在于它占用了大量内存。有没有办法在一些适度的记忆中
答案 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。