質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

397閲覧

ruby 組合せ 計算時間短縮方法

knt_krmt

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

0クリップ

投稿2019/03/13 08:22

編集2019/03/13 10:25

e×2の数を2つで分けたい時の組合せを下のプログラムで表した、最終はm_0の前後で表している。
分ける際数字は小さいもの順に並べます。
e=100の時、200を2つに分ける時の組合せが多すぎて、時間が掛かってしまいます。その対処方法がわかる方いらっしゃいますか??

ruby

1e = gets.to_i 2m = (e*2).times.map{|i| i+1 }.combination(e).to_a 3 4m_0 = (m.count/2).times.map{|i| 5 m[i]+m[m.count-i-1] 6} 7puts m_0 8 9
DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/03/13 08:38

このままのコードではm_0の中身は「配列」となりますが、得たいものはそれで間違いないでしょうか?
knt_krmt

2019/03/13 10:30

返事ありがとうございます。 はい、配列で間違いないです。 e=2の時 e = gets.to_i m = (e*2).times.map{|i| i+1 }.combination(e).to_a a = (m.count/2).times.map{|i| m[i] } b = (m.count/2).times.map{|i| m[m.count-i-1] } puts a => [[1, 2], [1, 3], [1, 4]] puts b => [[3, 4], [2, 4], [2, 3]] 本当はこのようにa,bと分けたいのですが数が多くなると処理時間が増えるので。
guest

回答3

0

combinationの順序は保証されないので、2つに分けたいのなら、順番に書けば良いのでは?

Ruby

1e = gets.to_i 2open("a.txt","w") do |a| 3open("b.txt","w") do |b| 4 1.step(e*2).to_a.combination(e).each_slice(2) do |x,y| 5 a.puts x.inspect 6 b.puts y.inspect 7 end 8end;end

ディスクが足りないと思いますけど。

そもそもから、考え直すべきですね。

投稿2019/03/13 17:10

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

e=100の時、200を2つに分ける時の組合せが多すぎて、時間が掛かってしまいます。

どうしようもありません。欲しい結果自体が膨大な配列である以上、回避するすべはありません。

投稿2019/03/13 10:56

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

200C100を計算させると分かりますが9e58という膨大な組み合わせが存在し
列挙するのは時間・メモリの都合上無理です。

他の条件ややり方を精査し、列挙しない方法を探すべきです。


ちなみに、n.times.map{|i|よりもArray.new(n){|i|の方が僅かにパフォーマンスがよいですし
この場合は、(1..e*2).to_a[*1..e*2]のがラクかな と思います。

rb

1m_0 = (m.count/2).times.map{|i| 2 m[i]+m[m.count-i-1] 3} 4puts m_0

なにやってるのか分かりづらいですし、るりまによるとcombinationで得られる組み合わせの順序は保証されていないらしいので
常に正しいかはわかりません。

rb

1all = [*1..e*2] 2m = all.combination(e).to_a 3m_0 = m.select{|a|a.include? 1}.map{|a| [a, all-a]}

こんな感じのほうが読みやすいと思いますよ

投稿2019/03/13 10:45

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問