【问题标题】:Memoization for generating permuatation用于生成排列的记忆
【发布时间】:2011-12-19 16:21:54
【问题描述】:

有没有什么办法可以生成排列的记忆技术。例如 对于数字 1234...

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

【问题讨论】:

  • 你的意思是:如何枚举排列?

标签: algorithm memoization


【解决方案1】:

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

【讨论】:

  • 如果我不存储它们而只显示,那么每次我必须重新计算我已经计算过的东西.....
【解决方案2】:

是的,当然,可以使用 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() 的某些调用仍将计算两次或更多次。

【讨论】:

  • 我明白你的意思,但我认为使用地图的想法不是很好,因为地图故事 lgn(对数)时间来检索具有给定键的元素。
  • @AbdulSamad:Map 是抽象数据类型,例如,它可能实现为 HashMap,因此需要摊销 O(1)(恒定时间)。即使使用树实现,对于大多数 perms() 调用来说,它仍然会更快。
【解决方案3】:

如果您想连续生成排列而不是同时需要它们,那么您最好按字典顺序遍历它们。编写一个函数nextPerm,接受一个排列并返回next permutation in lexicographic order

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2020-11-23
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多