【问题标题】:Heavy load on the computer caused by repeated permutations重复排列导致计算机负载过重
【发布时间】:2017-01-14 08:46:38
【问题描述】:

我遇到了以下问题,我想在一个字符串数组中进行所有可能的组合,并且只返回组合总数中元素的特定组合。

数组看起来像这样。

array = ['ab','bc','cd','de','bd','ae']

在这个例子中,输入是

source = 'a'   target = 'd'

我现在用来获取我想要的字符串的代码就是这个。

(2..2).flat_map do |n|
  array.repeated_permutation(n).map(&:join).select do |string|
    string[0] == source && string[-1] == target && string[1..2].squeeze.size == n - 1
  end
end

输出看起来像这样

['abbd']

当我选择字符串时,我想确保字符串的最后一个字母是下一个字母的第一个。

现在它可以工作,但我遇到了几个问题,

  1. 大量重复排列,8个或以上,电脑就死机,无法处理这么多的组合,所以我需要一种不同的方法来减少负载。

  2. 很难在排列之前实施选择过程以帮助减少负载,因为在执行 repeat_permutations 方法之后会生成组合。

【问题讨论】:

  • 暴力破解似乎相当低效,因为在每个步骤中,您的数组中似乎只有少数元素是合格的(例如,第一次必须以 a 开头)。你的第二个问题我不清楚
  • 您好 Frederick,对于第二点很抱歉。确实写的很差。我将对其进行编辑以使其更清晰
  • 看起来是正则表达式的完美用例!
  • “巨大的重复排列”是什么意思?
  • @Nakilon,我的意思是,通过在数组上调用方法 repeat_permutations(8) 或更多,它创造了太多的可能性,它们会导致计算机崩溃

标签: arrays ruby performance permutation memory-efficient


【解决方案1】:

我。

你可以看到它起初只是一个枚举器(它永远不会冻结你的计算机,直到你将它转换为 Array 或遍历它):

array.repeated_permutation(2)
=> #<Enumerator: ["ab", "bc", "cd", "de", "bd", "ae"]:repeated_permutation(2)>

.map 转换为数组。为避免这种情况,您应该使用惰性块形式:

array.repeated_permutation(2) do |a, b|
  break [a, b].join if a[0] == source && a[-1] == b[0] && b[1] == target
end

或者最好在上面调用.find,这样如果找不到,它会返回nil(在条件语句中类似于false):

array.repeated_permutation(2).find do |a, b|
  a[0] == source && a[-1] == b[0] && b[1] == target
end

二。

我猜你想在图中找到从一个顶点到另一个顶点的路径。
我相信这在 Ruby 中已经实现了很多次,你可以看看"Optimizing breadth-first-search code" question on Codereview site

【讨论】:

  • 感谢@Nakilon 的回答,我发现它比我以前的稍微有用,但是在查看8个或更高的重复排列时仍然需要很长时间才能加载。
  • @Trismegisto,还请注意,有时 Ruby stdlib 中的这些组合方法在排序数据上效果更好:codereview.stackexchange.com/a/128788/665
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多