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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

2回答

1152閲覧

複数のレコードの組み合わせから、条件に適用する組み合わせを抽出したい。

crosschan

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2021/05/01 11:04

編集2021/05/01 11:08

【現状】
以下のような機能をC#で実現したいのですが、方法(アルゴリズム)について総当たりしたパターンから指定条件に適用する組み合わせを羅列する以外の方法が思いついておりません。そうなると処理時間がかなりかかっていまうのでは?と思っています。

【実現したいこと】
・「あ」「い」「う」のグループがあり、各グループは共通する項目[A][B][C]を持つレコードを複数所持している。

・各グループから1レコードずつ選択し、各項目の値の合計値が指定した条件になる組み合わせを抽出したい。
条件例:
例1:[A]が100以上、[B]が150~200の間、[C]が5以下となるパターン
例2:[A]が50以上で、[B]x[C]が最大となるパターン
例3:[A]が10のレコードを2つ、[A]が20のレコードを1つ選択し、[B]の合計が最大となるパターン

・最終的にはグループは6個、項目は9個で実装したい。

【質問内容】
1.数学的な考え方で効率化できそうな気がするのですが、どのような方法について学べばよいでしょうか。

2.総当たりで作成しても各グループのレコード数が数百程度なら処理速度に問題はなさそうでしょうか。(ざっくりですみません)

以上、よろしくお願いいたします。

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

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

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

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

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

seastar3

2021/05/01 11:42

SQLServerの使用は考慮されていますか。それとも、配列のみでの処理でしょうか。
crosschan

2021/05/01 11:50

SQLServerは使用しない想定です。 csv(tsv)から読み込んだデータを、項目[A][B][C]を持つclassへ格納し、List型を利用し実装できないかと考えています。 (普段SQLServerを利用する際は上記のList<class>をDBへ格納していました)
seastar3

2021/05/01 12:20

なるほど、各条件の判定結果を返事するメソッドを持つクラスを、各レコード分だけインスタンス化していくやり方で、自ら返事してくれるでしょう。早さも数百件では問題ないでしょう。 条件例3の場合は、各インスタンスに順位変数を用意して、メイン処理で順位を認定してやり、その順位を手掛かりにメインルーチン側でまとめなければなりませんね。
guest

回答2

0

1.数学的な考え方で効率化できそうな気がするのですが、どのような方法について学べばよいでしょうか。

「組み合わせ最適化」問題ですが、勉強したところで効率的な方法が発見されていない領域が多いのでたいして役に立つとは思いません。
各条件に対してアドホックなアルゴリズムを選択するしかないでしょう。例えば例3なら各グループに対して条件を満たすもののうち[B]が最大のものだけ候補に入れればいいですし、各レコードが整数で例のように値域が小さいなら擬多項式時間アルゴリズムで十分高速にとけることもあります。
いずれにしても解けない問題は解けないので、どういう問題が解けるのか知るのが大事だと思います。
組み合わせ最適化(AOJ)

2.総当たりで作成しても各グループのレコード数が数百程度なら処理速度に問題はなさそうでしょうか。(ざっくりですみません)

グループが3つならせいぜい数秒で終わるでしょうが、6つだと数日から数年かかると見たほうがいいでしょう。問題あるかどうかは用途次第です。

投稿2021/05/02 12:47

yudedako67

総合スコア2047

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

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

0

1.数学的な考え方で効率化できそうな気がするのですが、どのような方法について学べばよいでしょうか。

この類いの計算をやるなら線型計画法を勉強しておきましょう。

2.総当たりで作成しても各グループのレコード数が数百程度なら処理速度に問題はなさそうでしょうか。

まあ、大丈夫でしょう。

投稿2021/05/01 14:45

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問