我遇到以下问题,我希望在字符串数组中进行所有可能的组合,并且只返回组合总数中特定元素组合。
数组看起来像这样。
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']
当我选择字符串时,我想确定的是字符串的最后一个字母是下一个字母的第一个字母。
现在它有效,但我遇到了几个问题,
随着8次或以上的大量重复排列,计算机只是冻结,它无法处理如此庞大的组合,所以我需要一种不同的方法来减轻负载。
在执行repeat_permutations方法生成组合之后,难以在排列之前实现选择过程以帮助减少负载。
答案 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
我想你想在图表中找到从一个垂直到另一个垂直的路径 我相信这在很多时候都是在Ruby中实现的,你可以查看"Optimizing breadth-first-search code" question on Codereview site