【发布时间】:2011-12-19 16:21:54
【问题描述】:
有没有什么办法可以生成排列的记忆技术。例如 对于数字 1234...
对我来说,问题是它占用了大量内存。有没有办法在一些适度的内存中
【问题讨论】:
-
你的意思是:如何枚举排列?
标签: algorithm memoization
有没有什么办法可以生成排列的记忆技术。例如 对于数字 1234...
对我来说,问题是它占用了大量内存。有没有办法在一些适度的内存中
【问题讨论】:
标签: algorithm memoization
对于任何字符串,比如说有 n 个不同的字符,n!存在排列,因此需要的空间会很大。如果您只需要枚举排列,那么我建议不要存储它们,而是在计算每个排列时直接显示每个排列
【讨论】:
是的,当然,可以使用 memoization 来生成置换(就像几乎任何其他计算一样,当它有意义时)。具体步骤取决于您的排列生成算法。例如,如果你有函数perms(numbers),它接受一组数字(比如{1, 2, 3, 4})并通过递归调用perms()返回所有排列的集合(这些数字的有序向量,比如{[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], ...}) numbers,你可以直接记住这个perms()函数。为此,请将缓存创建为映射,其中键是数字集,值是函数调用的结果。
关于问题的第二部分(关于记忆)。记忆化本质上会使用大量内存。您始终可以通过使用某种固定大小的缓存(例如 LRU/LFU 映射)来修复此数量,但您应该了解这会破坏记忆概念,并且对 perms() 的某些调用仍将计算两次或更多次。
【讨论】:
perms() 调用来说,它仍然会更快。
如果您想连续生成排列而不是同时需要它们,那么您最好按字典顺序遍历它们。编写一个函数nextPerm,接受一个排列并返回next permutation in lexicographic order。
【讨论】: