【发布时间】:2014-10-05 10:40:52
【问题描述】:
假设我有这个数组:
a = [1,2,3,3,3,3,3,3,3,3,3,4,5,6,6,7,8,9,10,11]
a.each_slice(2).to_a 将生成对,但这些对将包含非唯一值,例如 [3,3]。所以我想我正在寻找某种 unique_each_slice 方法。
我想要的是能够不断改组这个数组,直到我有唯一的 2 对(不必是 2,可以是任何东西),就像这样(以 2 为例) :
[3, 1, 3, 7, 6, 3, 4, 5, 8, 3, 9, 3, 2, 3, 6, 3, 3, 11, 10, 3]
如果你对这个数组执行 each_slice(2),你会得到唯一的对:
[[3, 1], [3, 7], [6, 3], [4, 5], [8, 3], [9, 3], [2, 3], [6, 3], [3, 11], [10, 3]]
与原来的相比:
[[1, 2], [3, 3], [3, 3], [3, 3], [3, 3], [3, 4], [5, 6], [6, 7], [8, 9], [10, 11]]
每个都有非唯一的对,例如 [3,3]
另一个例子,假设我有:
a = [1,2,3,3,3,3,3,3,3,3,3,4,5,6,6,7,8,9,10,11,12,13,14,15,16,17]
现在,假设有一些函数 a.unique_slices_of(3),我会得到:
[[4, 16, 3], [1, 9, 3], [3, 6, 17], [3, 6, 10], [15, 3, 2], [3, 8, 12], [11, 3, 14], [7, 13, 3], [3, 5]]
“唯一切片”是指相同数字不重复两次的切片:[1,2,3] 是唯一切片,[3,1,3] 不是。
到目前为止,我采用了以下方法,似乎需要多次迭代才能正确处理:
class Array
def unique_slices_of!(slices)
loop do
unique = true
self.each_slice(slices) do |slice|
if slice != slice.uniq
self.shuffle!
unique = false # so we know whether to loop again
break
end
end
break if unique # if unique didn't change, that means all slices were equal
if unique == false then unique == true end # reset and start again
end
self
end
end
我的代码的主要问题是 a) 我认为我没有使用一些惯用的 Ruby 方法,它可以将这个过程缩短一半或更多。 b) 如果数组不能包含唯一切片,则可能出现无限循环。我可能需要在这里使用一些组合理论,但我不确定如何。
【问题讨论】:
-
输出是否必须是随机的,或者如果你得到一个这样的数组就足够了,即使这是一个系统计算的数组?
-
长度不必是倍数。关于随机性/系统计算的,没关系。
-
@meagar,我认为这个属于灰色区域。尽管有标题,OP实际上是在问,“我想实现一个算法......我尝试了以下方法,其中随机选择序列,但可能需要很长时间才能解决一些问题。”这类问题在 SO 上相当常见。
-
我建议您将标题更改为“重新排列数组,以便 each_slice 生成具有唯一元素的数组”。随机生成可能的解决方案是一种方法,但正如您上面所说,这不是必需的。您也可以将“shuffle”替换为“permuting the elements of”。
标签: ruby arrays random-sample