グループ分けのアルゴリズム

このQ&Aのポイント
  • 重複しない複数の数字を、2つのグループに分けるアルゴリズムを教えてください。
  • 数字の配列を渡すと、2つのグループに分ける組み合わせを返すプログラムを作りたいです。
  • 例えば、数字[1, 2, 3]の場合は[1 | 2, 3]、[2 | 1, 3]、[3 | 1, 2]の3つのグループに分けられます。
回答を見る
  • ベストアンサー

グループ分けのアルゴリズム

重複しない複数の数字を、2つのグループに分けるアルゴリズムを教えてください。 例としては、 数字 : [1, 2, 3] グループ : [1 | 2, 3 ]、[2 | 1, 2]、[3 | 1, 2] の3グループ。 数字 : [1, 2, 3, 4] グループ : [1 | 2, 3, 4]、[2 | 3, 4, 1]、[3 | 4, 1, 2]、[4 | 1, 2, 3] [1, 2 | 3, 4]、[2, 3 | 4, 1]、[1, 3 | 2, 4] の 7グループ。 こんな感じで、数字の配列を渡すと、 2つのグループに分ける組み合わせを返す プログラムを作りたいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8018/17137)
回答No.1

'エクセルVBAで書いてみた。 '2つのグループのうち、1番目の数字が含まれるほうだけA列に書き出す。 '要するに組み合わせnCkを計算しているに過ぎない。 Dim j As Long 'j 書き出し行 Dim inary() Sub cbb() 'n 数字の個数 'inary 数字 j = 0 n = 4 ReDim inary(n) For i = 1 To n inary(i) = i Next i ' For k = 0 To n - 2 Call cb(n - 1, k, 2, "") Next k End Sub Sub cb(n, k, i, ans) If k = 0 Then Range("a1").Offset(j) = inary(1) & ans j = j + 1 Exit Sub End If If n = 0 Then Exit Sub End If Call cb(n - 1, k - 1, i + 1, ans & " " & inary(i)) Call cb(n - 1, k, i + 1, ans) End Sub

kokukuma
質問者

お礼

ありがとうございます!。 なんとかできました。

関連するQ&A

  • グループ分け

    シャッフルした配列の先頭から順番に各グループに割り当てていくプログラムを教えてください。

  • 組み合わせ問題のアルゴリズム

    あらかじめ用意された整数を足して、その合計がある指定された整数と等しくなる組み合わせの数を調べるプログラムを書こうとしているのですが、苦労しています。 具体例がないと伝わりにくいかもしれないので例をあげると、 例えばあらかじめ用意された整数というのが 1・1・2・2・5・8 の4つで、 指定された整数が10である場合は、 8と2 8と1と1 5と2と2と1 という3通りの組み合わせがあるので、3を出力したいというわけです。 今まではもっと単純なアルゴリズムしか考えてこなかったので、こういった組み合わせのような問題が難しく感じられます。 こういう場合、アルゴリズムはどのようなものが考えられるでしょうか。 よろしくお願いします。

  • 重複しないグループ分けをエクセルで

    excel2010を使用しています。 1~9までを3つずつ3グループに分ける作業を4回行い、4回とも重複しないようにしたいのですが、エクセルの関数でうまく重複を避ける方法があるのでしょうか?         Aグループ Bグループ Cグループ 1回目    1-2-3  4-5-6  7-8-9 2回目    1-4-7  2-5-8  3-6-9 3回目    ・・・ 4回目    ・・・ のようにすべての回で重複しないようにしたいと思っています。 9つを3つずつ・・・は手書きでもなんとかなると思いますが 1~12を4つずつ3グループに重複しないで・・・ 1~15を5つずつ3グループに重複しないで・・・ 1~18を6つずつ3グループに重複しないで・・・ というように応用したいと思いますので、ぜひエクセルの関数かVBAのプログラムで作成できるようにしたいと思っていますが、どのような関数をどのように使えばいいのかわからず困っています。 どなたかご教授いただけないでしょうか。   

  • グループから一番の組み合わせを選択するアルゴリズム

    お世話になります。 標題のプログラムを組みたいと思ってます。 一定の条件でグループ化された2次元配列を持っています。 Group()()このうち、2次元目のグループの要素数はまちまちです。 それぞれのグループ毎に2個以上の全ての加算組み合わせを算出し、ある閾値の中に収まり、一番上限の閾値に近い値を算出したいと思ってます。 例えば、グループの要素数が4個の場合。 要素をA、B、C、Dとする 2個以上を加算する全てのパターンを計算する A+B+C+D、A+B+C、A+B+D、A+C+D、B+C+D、A+B、A+C、A+D、B+C、B+D、C+D 上記の計算結果のうち、2つの閾値50と100だとしたら、100以下で一番100に近い値を算出する。その値の要素も参照できるようにしたいです。 言語はVisualBasicとしていますが、他の言語でもアルゴリズムがわかれば大丈夫です。 すみませんが、ご教授お願いいたします。

  • グループ分けの仕方について

    group listを作ろうと思っています。 groupが1…n個あり、 group1にa,b,c、group2にe,f、group3にg,h,i,j、group4...みたいな感じでリストを作ろうとしています。 ぼくは、連想配列か、二次元配列でやろうかなと思っています。 このリストを今後扱う上で、どちらのほうで作ったら便利ですか? また皆さんならどのように作りますか?

    • ベストアンサー
    • Perl
  • 数千の配列をランダムに並べて表示

    数千の配列をランダムに並べて表示させるプログラムを作りたいと思っています。プログラムはPHPを考えています。 例えば配列数を1000だとすると $file_name[0] = "files0"; $file_name[1] = "files1"; $file_name[2] = "files2"; $file_name[3] = "files3"; $file_name[4] = "files4"; ・・・ $file_name[999] = "files999"; だとします。この配列からランダムに重複無く表示したいと思っています。出力例として、 files3 files328 files1 files32 ・・・ files473 とこんな感じです。私の考えたアルゴリズムではランダムの数字を出力し、その配列が表示されていれば再度ランダムな数字を算出、配列が表示されていなければ表示し、配列が表示されたというフラグを付けます。 しかし、この方法だと最初はスムーズに出てくるのですが、最後にはなかなか出力されないようになります。当然といえば当然ですが。 アルゴリズムだけでも、ご存知の方ご教授いただけると幸いです。

    • ベストアンサー
    • PHP
  • グループ分けの問題

    ランダムな数字があり(大きさも個数も特に制限無し)、それを次のように グループ分けします。 ・グループ内の数字の合計がある値(これは与えられます)以上であること。 この条件を満たして、グループの数をできるだけ多くしたい。 それを解くようなプログラムはできないでしょうか? プログラムでなくても 必ず最適な解が見つかる指針でも結構です。 宿題とかではありません。 私が手でやる時は、、、例えば、合計を1万とします。 まず、大きな数字から拾っていって、合計1万に近づいたらできるだけ大き く超えない数を探す。取り敢えず1グループできたら、その繰り返し。 そして最後のグループ。もし、そのグループの不足が他のグループの超過の 合計より大きければそれでお終いですが、超過の合計の方が大きい場合、数 の入れ替えを行いながら微調整をします。例えば、現在合計10100のグループ の中に300があり、1万に達していないグループに210があったとすると、それ らを入れ替えれば10100-->10010となり、無駄が減り、残りのグループの合計 を90増やすことができます。このようにして数(orその合計)の近い数(orその グループ)の組を見つけて入れ替えることにより、調整を行い、不足している グループが1万を超えるように試行錯誤します。 でも、例えば10100のグループが4つ、残りの合計が9700だった場合、超過の合 計は400ですが、5グループにするのは可能なのか、不可能なのかわかりません。 手でやっていて、それが最適解かどうかわからないので、気持ち悪いです。 よろしくお願い致します。 以上

  • 組み合わせを作るアルゴリズム

    アルゴリズムについてうまい考えが浮かばず、お知恵を拝借できればと思い質問致しました。 要件は、値が100個ほど入った配列があり、この配列から任意の個数の値を取り出して処理をする、というものなのですが、とにかく全ての組み合わせを取り出したいのです。 例えば @data = (3, 6, 8, 6); という配列から2個取り出すとすれば、 (3, 6) (3, 8) (3, 6) (6, 8) (6, 6) (8, 6) という全6パターンが欲しいのです。(パターンの出現順は無視できます。) 順番違いはなくてよいので、たとえば (6, 3) というリストはなくて結構です。 また (3, 6) のように、全く同じリストが複数出現してもOKです。 取り出す個数が固定ならばforループのネストで処理のしようもあるのですが、任意ということでここの処理方法が浮かびません。 (ちなみにrは最大で10まで取り、できればforのネストも避けたいところなのですが。) このような処理に適した処理方法をご存知の方おられましたら、ぜひともご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 走査アルゴリズムについて

    n個の要素の配列x[]について 配列xの連続した要素(部分配列)でその和が最大になるものを見つけて、 その和を出力するアルゴリズムについてです。 これなのですが解き方の考え方に 「x[0...n]までの部分配列の最大和は、x[0...n-1]の部分配列の最大和か、x[n]から左方向に伸びた配列の和のいずれかである。」 とあり プログラムには float maxSoFar(float x[], int length){ float maxsofar = 0; float maxendinghere = 0; for(int i = 0; i < length; i++){ maxendinghere = max(0.0f, maxendinghere + x[i]); maxsofar = max(maxsofar, maxendinghere); } return maxsofar; } とあるのですが、アルゴリズムの仕組みがよくわかりません。 なぜ上のような説明でこのようにプログラムできるのかが わからないので、どなたかうまい説明できる人お願いします><

  • シミュレーテッドアニーリングによる組み合わせ最適化問題

    pythonで最適化問題について学んでいます。 1から7の7つの数字からから5つの数字をを取り出すプログラムを書こうと思っているのですが、このときにその取り出す5つの組み合わせがなるべく強い組み合わせ(大きな数字)になるようにプログラムしたいのです。できればシミュレーテッドアニーリングのアルゴリズムを使ってプログラムしたいのですが、どうもよく分かりません。 pythonでなくC++でもjavaでもいいので、良い方法、書き方などあったら教えてください。

専門家に質問してみよう