重复排列导致计算机负载过重

时间:2016-09-06 19:46:00

标签: arrays ruby performance permutation memory-efficient

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

数组看起来像这样。

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方法生成组合之后,难以在排列之前实现选择过程以帮助减少负载。

1 个答案:

答案 0 :(得分:0)

你可以看到它最初只是一个枚举器(在你将它转换为数组或迭代它之前永远不会冻结你的计算机):

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

.map转换为Array。为了避免它,你应该使用惰性块形式:

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

II。

我想你想在图表中找到从一个垂直到另一个垂直的路径 我相信这在很多时候都是在Ruby中实现的,你可以查看"Optimizing breadth-first-search code" question on Codereview site