【发布时间】:2017-12-01 01:21:21
【问题描述】:
我正在迭代列表(18 项)的排列,如下所示:
List = [item0..item18] # (unpredictable)
Permutation_size = 7
Start_at = 200_000_000
for item, i in List.repeated_permutation(Permutation_size).each_with_index
next if i < Start_at
# do stuff
end
Start_at 用于从以前保存的状态恢复,所以它总是不同的,但几乎需要 200s 才能达到 2 亿,所以我想知道是否有更快的方法来跳过多次迭代或从迭代 n 开始(将枚举数转换为数组需要更长的时间)。如果没有,我们也将不胜感激创建自定义 repeated_permutation(n).each_with_index(产生相同顺序的结果)的方法。
请随时将我重定向到现有答案(我还没有找到任何答案)
附言。 (我想出的)
class Array
def rep_per_with_index len, start_at = 0
b = size
raise 'btl' if b > 36
counter = [0]*len
# counter = (start_at.to_s b).split('').map {|i| '0123456789'.include?(i) ? i.to_i : (i.ord - 87)} #this is weird, your way is way faster
start_at.to_s(b).chars.map {|i| i.to_i b}
counter.unshift *[0]*(len - counter.length)
counter.reverse!
i = start_at
Enumerator.new do |y|
loop do
y << [counter.reverse.map {|i| self[i]}, i]
i += 1
counter[0] += 1
counter.each_with_index do |v, i|
if v >= b
if i == len - 1
raise StopIteration
else
counter[i] = 0
counter[i + 1] += 1
end
else
break
end
end
end
end
end
end
【问题讨论】:
-
list的最大近似大小是多少? -
理想情况下,我想要一个通用解决方案,但现在大小始终为 18
标签: ruby next skip continue enumerator