• 締切済み

方法論

多次元配列 Array [n]["グループ"] = array("key", "値") グループは 二種類 "A"と"B" keyは固有整数 値は 0から100のdobule型 "A"と"B"の数は同等もしくは同等ではない なので配列の数もn個となる このように定義された配列の中からある条件の組み合わせを作りたいと思っています。 条件とは ・グループ "A"より"B"の値が1以上大きく、かつそのなかでもっとも距離が近い組み合わせ。 ・ペアになった組み合わせ以外のもので次のペアを組み合わせる ・ペアになったものは Pair[n] = array("Aのkey", "Bのkey")の配列へ代入する ・ペアになりきれずに残ったものは Protrude[n] = keyの配列へ代入する 優先順位 精度 > 速度 > 負荷 これを実現するためのロジックをみなさまはどのような方法で組まれますでしょうか? アイデアをご教授いただけますようお願いいたします。

  • PHP
  • 回答数3
  • ありがとう数0

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

そういう意味でしたか。 「これを実現するためのロジック」ということなので、全体の流れと思いました。 私なら、まずは $keysA=array(Aのkey全て) $keysB=array(Bのkey全て) を2重ループにします。 もっと便利だったり効率がいい方法はあるかもしれません。 ですが、それを考えたり調べたりする時間で、2重ループのプログラムを完成させることができます。 単純なコードになるので、間違えることも少ないでしょう。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

その説明でも、「距離」についてよくわかりません。  距離1:= abs(Aのkey - Bのkey) なのですか?  距離2:= abs(Aの値 - Bの値) なのですか? 1に近い、というなら  距離3:= abs(「距離1または距離2」-1) なのでしょうか? > ・グループ "A"より"B"の値が1以上大きく、かつそのなかでもっとも距離が近い組み合わせ。 とから、前半が「距離」と推測すると  距離4:= (Bの値 - Aの値 >=1.0 ) ? (Bの値 - Aの値) : ∞ ; ということなのでしょうか。 また、「ペアになった組み合わせ以外のもので次のペアを組み合わせる」とはどんなことなのでしょうか? Aのkey,Bのkey = (0,2),(4,2) があったとして、(0,2)が採用されたら、 ・(4,2)は B=2が採用されているので、候補とはならない ・(4,2)は 「(0,2)」では無いので、次の候補となりえる のどちらなのでしょうか? とりあえず、効率無視の総当たり、上記の条件がどれでも使えるような抽象的なものです。 (1) 候補リスト[i] = array( Aのkey, Bのkey,評価のための情報(「距離」等... ) というような、AのkeyとBのkeyとの組み合わせについての「候補リスト」を作る (2) 条件を満す最適な候補を採用する。→ Pairに追加 採用できなかったら(5)へ (3) (2)で採用した組合せ以外が残るように、候補リストを変更する (4) (2)へ戻る (5) 候補が残っていたら、Protrudeに追加 (2)の方法が問題になってくるでしょう。 同率の場合の扱いによって、全体の結果が変わります。 また、最短距離のペアを採用しない方が全体のペア数が多くなる、ということもあるでしょう。

blchox
質問者

補足

回答かりがとうございます。 まず、距離についてですが >・グループ "A"より"B"の値が1以上大きく、かつそのなかでもっとも距離が近い組み合わせ 質問にて以上のように書いていますので、Bの値 - Aの値 >= 1 となります(私の勘違いで、質問および補足にてA-Bと書いたのですが、質問の文言を正とするためここで改めます。) またもっとも近いとはdouble型であるため1.1であったり1.01であったりします。(この限りではない) そうした場合1.01となる組み合わせを見つけ出すことを目的としています。 >Aのkey,Bのkey = (0,2),(4,2) これについては(0,2)を採用した場合、次のペアは0と2以外のものにて総当たりとなります。 私の日本語が下手なのかなかなか伝わらないものですね。 私はフローが知りたいのではなくて いかにして一つの多次元配列にある値を総当たりさせるロジックを組むかということを聞いています。つまり、人によってはfor文だったりforeachだったりforやforeachの入れ子だったり一度別の配列へ入れなおすとか目的を達成するためにいろいろな書き方があるとおもいます。そのような他人さまの書き方を参考にしたり採用させてもらったりしたいのです。 例えるならば(あくまでも物の例えです) ボルトをBとナットをAとしボルトの軸の径とナットの穴の径がそれぞれの値で距離とはボルトとナットの間にまくシールパッキンと考えてみてください。 シールパッキンの厚みが1とするのでボルトの軸径+1が必要です。 ボルトの軸径とナットの穴径には大きいものや小さいもの同じものさまざまあります。 それぞれのボルトとナットには個体番号があります。 理想はボルトの軸径とシールパッキンの厚みを足したときナットの穴径とが一致すればいいのですが、そうはなかなかいきません。 ですので、ボルトの軸径より小さい穴へのナットはどうしても入れることができませんので、大きいものを探していくこととなります。 その場合、軸径+1より大きい穴径があった場合シールパッキンを重ねればその差は埋まるものと考え組み合わせが可能と考えます。 (2重にしたら2だろうという突っ込みは無しです) 一本のボルトに一つのナットなのでペアができればそのボルトやナットはほかのボルトやナットとペアになることはできません。 この際気をつけないといけないのが、ボルトの軸径やナットの穴径が整列されていないことであり、 ボルトの軸径を基準にしてナットを見つけていく場合と、ナットの穴径を基準にしていく場合とでは組み合わせが異なる場合があるということ。 このことから完全に総当たりをして最適なものを見つけないといけないということです。 同率の場合とありましたが、ナットの穴径が同一のものが複数ある場合があります。この場合どのナットを使ってもの構わないということ。 ボルトの軸径が同一の場合も複数ある場合がありますが、これもどのボルトを使ってペアになっても構わないということ。 そうして作っていったペアにより残ったボルトとナットが出てくるようになります。 この残るものが何なのかをしりたいのです。 残ったものに対してペアを作るため最も適した軸径や穴径を用意したらいいのかを見つける作業をするために上記のロジックが必要となります。 そのため全体のペアの数においては、ボルトの軸径+1 <= ナットの穴径 であるならば最終的にペアとなるため、 1に近い値のペアをつくることが結果的にペアの総数が多くなると思っています。 10:5の比率であれば、どちらか小さい数>=ペア数となるはずです。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>もっとも距離が近い組み合わせ。 「距離」って何ですか?

blchox
質問者

補足

A-Bの値がもっとも1に近い組み合わせという意味になります。

関連するQ&A

  • 2つの配列/キーが一致する際、要素数の出現回数を求

    2つの配列があり、かつキーが一致する際、要素数の出現回数を求めたいのですが、 どうすれば良いでしょうか? 具体的には、下記「a、b」より「c、d」を導き出したいです ■元データ( a、b キーは対応) Array a (   [0] => 1   [1] => 2   [2] => 2   [3] => 1   [4] => 3   [5] => 1   [6] => 2   [7] => 2   [8] => 3   [9] => 1 ) Array b (   [0] => 0   [1] => 1   [2] => 0   [3] => 1   [4] => 1   [5] => 1   [6] => 1   [7] => 0   [8] => 2   [9] => 1 ) ■欲しい結果 Array c … 「Array b」が1の時の、「Array a」の値の出現回数(キーは「Array a」の値) (   [1] => 3   [2] => 2   [3] => 1 ) Array d … 「Array b」が1以外(0または2)の時の、「Array a」の値の出現回数(キーは「Array a」の値) (   [2] => 2   [1] => 1   [3] => 1 ) ■備考 「Array b」が1の時の「Array a」   [1] => 2   [3] => 1   [4] => 3   [5] => 1   [6] => 2   [9] => 1 ・1が3回 ・2が2回 ・3が1回 「Array b」が1以外の時の「Array a」   [0] => 1   [2] => 2   [7] => 2   [8] => 3 ・2が2回 ・1が1回 ・3が1回

    • ベストアンサー
    • PHP
  • 多次元配列

    初歩的な質問ですみません。 PHPプログラミングでの質問です。 仮に、多次元配列Aに、 Array( [0] => Array ( [0] => 6 ) [1] => Array ( [0] => 2 [1] => 1 ) [2] => Array ( [0] => 0 [1] => 5 [2] => 4 ) ) 多次元配列Bに、 Array( [0] => Array ( [0] => りんご ) [1] => Array ( [0] => ぶどう [1] => パイナップル ) [2] => Array ( [0] => みかん [1] => すいか [2] => メロン ) ) のように値が入っている場合、配列Aの値を参照して 値の大きいものから順に、それに対応する配列Bの値を取り出し、 あたらしい配列Cに代入する処理の書き方を教えて下さい。 上記の例ですと、配列Cが、 Array ( [0] => りんご [1] => すいか [2] => メロン [3] => ぶどう [4] => パイナップル [5] => みかん ) となるようにしたいです。 よろしくお願いします。 長文失礼しました。

    • ベストアンサー
    • PHP
  • 【PHP】配列を連想配列に

    $m = array('a', 'b', 'c'); この配列 $m をもとに $n = array(  'a' => array(   'b' => array(    'c' => array()))); 上のような連想配列 $n をつくりたいのですが、 $n = array(  $m[0] => array(   $m[1] => array(    $m[2] => array()))); 要素の数が固定のときは、これでもいいのですが、数が変動する場合に対応できません。 何か方法があれば教えてください。

    • ベストアンサー
    • PHP
  • 配列を比較して同じものがあった場合にそのKEYを返す

    二つの配列を比較して同じ値が入っていた場合、そのKEYを配列に入れたいと思います。 (例)$aと$bを比較して同じ値が入っているときに$aのkeyを$cに格納したい。 $a = array("","","山","","川","海","","富士山","空","",""); $b = array("川","","","","","海","","富士山","空",""); ※空白は無視したい。 この場合 $c = array("4","5","7","8"); のようにしたいと思います。 どなたか教えてください。

    • ベストアンサー
    • PHP
  • ソート時同じ値がある場合、表示順をコントロールする事は可能ですか?

    ハッシュの配列を配列の数の多い順に表示する場合で配列の数が同じの場合の最初に表示される配列の数字につきまして この配列の数が同じである場合の表示順序を意図した順番にする事は可能でございますか? この意図した順番と申しますのは、小さい数字を先に表示するのではなく下記の@array2の配列値の並んでいる順や別途配列に0~9の数字を適当に入れておきにそれを参考に評価するという形を希望しており模索中なのですが、まずこの事につきまして可能か不可能かをご教授願いたいのと、もし可能でしたらどうか解決に至る先輩方のお知恵をお借り出来ませんでしょうか よろしくお願い致します。 #!/usr/bin/perl use Tie::IxHash; @array0_n=('a','b','c','d'); @array1_n=('e','f','g'); @array2_n=('h','i'); @array3_n=('j'); @array4_n=(); @array5_n=(); @array6_n=('k'); @array7_n=('l','n'); @array8_n=('m','o','p'); @array9_n=('q','r','s','t'); %array1 = ( '0' => [ (@array0_n) ], '1' => [ (@array1_n) ], '2' => [ (@array2_n) ], '3' => [ (@array3_n) ], '4' => [ (@array4_n) ], '5' => [ (@array5_n) ], '6' => [ (@array6_n) ], '7' => [ (@array7_n) ], '8' => [ (@array8_n) ], '9' => [ (@array9_n) ], ); #配列の数の多い順に並び替え my @array2 =reverse sort { scalar @{$array1{$b}} <=> scalar @{$array1{$a}} or $a <=> $b } keys %array1; @array9_n2=('a2','b2','c2','d2'); @array1_n2=('e2','f2','g2'); @array2_n2=('h2','i2'); @array3_n2=('j2'); @array4_n2=(); @array5_n2=(); @array6_n2=('k2'); @array7_n2=('l2','n2'); @array8_n2=('m2','o2','p2'); @array0_n2=('q2','r2','s2','t2'); tie %TmpList, 'Tie::IxHash'; #@array2を元に更に動的にハッシュ内に配列を作成 foreach(@array2){ my $x="array$_\_n2"; $TmpList{$_}=[(@$x)]; print "$_,$#{$x},@$x<br>\n"; } print "1-end\n"; while ( ( $key , $value ) = each %TmpList ){ print "key:$key value:@$value\n" ; } print "2-end\n"; my @array3 = sort { scalar @{$TmpList{$b}} <=> scalar @{$TmpList{$a}} or $a <=> $b } keys %TmpList; #Tie::IxHashモジュールで表示する際の順番を固定出来るかテスト foreach(@array3){ my $x="array$_\_n2"; $TmpList2{$_}=[(@$x)]; print "$_,$#{$x},@$x<br>\n"; } print "3-end\n"; __END__;

    • ベストアンサー
    • Perl
  • 配列に動的に連想配列を入れる方法を教えてください

    質問させてください。 $mods = array('def', 'con', 'vie'); (ここでは$modsの要素は3つですが、環境によって要素の数が変わるとします。) これを連想配列で array( 'def' => './a/b/def/o', 'con' => './a/b/con/o', 'vie' => './a/b/vie/o' ) のような形に動的にしたいと思います。 その為 array( $mods[$i] => './a/b/' . $mod[$i] . '/o', ) のように$modsの要素数だけ動的に入れていきたいのですがどのようにすればいいのでしょうか? array_push()だと値だけが入ると思うので、良く分かりませんでした。 $front->setControllerDirectory(array( 'default' => APP_DIR . DS . 'modules' . DS . 'default' . DS . 'controllers' )); のようなルーターにパスをその時の環境に合わせて$key=>$valueの連想配列をどんどん入れていきたいと考えております。 説明が分かりにくいかもしれませんが宜しくお願いします。

    • ベストアンサー
    • PHP
  • 空の配列を削除して、詰めていく。

    データベースから値を取ってくるとき、全て、同じ値が入ってくる場合があります。 $a = array(100,100,100,100,100)というような。 これを、array_uniqueで重複している値を削除したのですが、その際、print_rで見ると、 Array ( [4] => 100 ) と表示されました。つまり、キーが0ではなく、4となってしまっています。 array_uniqueで帰ってきた値が複数なら、さらにsortすることで0から始まる配列として並び替えられるのですが、1つしか帰ってこないとsortをしても、キーは変わらないようです。 この値を表示させるとき、countで配列の数を数え、さらにfor文でcountの数だけ回し、print $i;で表示させるようにしているのですが、上記のようにarray_uniqueで1つの値しか帰ってこないと、ページに値がきちんと表示できなくなってしまいます。 これを解決するために、空の要素を削除して、空白でない要素のキーを前に詰めてくれるような関数などを探しているのですが、何か方法などありますでしょうか? Array ( [4] => 100 ) が Array ( [0] => 100 )となるようにしたいのです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • ハッシュの中に格納された配列の要素数を得る方法

    予想配列のあるキーを配列とします。 %hash; @hash{'a'}=['aa','ab','ac']; 一方で普通の配列をスカラ変数として扱うと配列数を表します。 @array=(a,b,c,d,e); $num=@array; # $numは5になる。 それでは $num=@hash{'a}; あるいは  $num=@{hash{'a'}}; としたらどうなるのって ARRAY(0x2438c4) みたいになって、$numに@hash{'a'}の要素数は入りません。 予想配列の中に格納された配列の要素数を取り出す簡便な方法はないものでしょうか。 お手数をお掛けします。

    • ベストアンサー
    • Perl
  • array_combineがうまくいかないので、教

    array_combineがうまくいかないので、教えてください ■やりたいこと ・一方の配列をキー、もう一方の配列を値として、新たな配列を生成したい ■現状 $c = array_combine($a , $b);とやると、 Array c (   [1] => 2   [2] => 0   [3] => 0 ) となってしまいます ■元データ Array a (   [0] => 1   [1] => 2   [2] => 2   [3] => 1   [4] => 3   [5] => 1   [6] => 2   [7] => 2   [8] => 3   [9] => 1 ) Array b (   [0] => 0   [1] => 2   [2] => 0   [3] => 2   [4] => 2   [5] => 0   [6] => 2   [7] => 0   [8] => 0   [9] => 2 ) ■質問 ・元データから、下記結果を得るにはどうすればよいでしょうか? Array c (   [1] => 0   [2] => 2   [2] => 0   [1] => 2   [3] => 2   [1] => 0   [2] => 2   [2] => 0   [3] => 0   [1] => 2 ) ・また、array_combineだとなぜ望む結果が得られないのでしょうか? 重複しているから?

    • ベストアンサー
    • PHP
  • 参照変数の親配列を取得

    データの多次元配列があって、値に応じて動的に関数を選択し 中身の値を引数で渡すみたいな感じの処理をしています ほとんどの処理は中身の値だけあれば事足りるのですが 稀にキー値を使いたい処理がでてきます 本当に稀なので引数にキー値も渡すようにするのは 無駄が多くなるように思うので避けたく できれば参照変数で渡される値から 親配列でのキー値を取得したいと思っています $arr2A=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); $arr2B=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); $arr2C=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); foreach($arr2A as $key=>$val){ $fncs[$val['fnc']]($val); } foreach($arr2B as $key=>$val){ $fncs[$val['fnc']]($val); } foreach($arr2C as $key=>$val){ $fncs[$val['fnc']]($val); } $fncs=array( A=>function(&$arr){ }, B=>function(&$arr){ }, C=>function(&$arr){ //ここで稀にキー値も使いたい }); 実際のコードはかなり長いので載せられませんが 要約すると上記のような感じの処理です まずどのデータ配列の集合から渡されたのかが明確ではありませんので indexOfなどでキー値を得るのというのが難しいです 現在は、その処理が必要なデータ行について処理前に 中身にキー値をあらかじめ入れてしまう というように対応しているので、一応解決はしているのですが もし参照変数から親配列を得る方法が あればと思い質問させていただきました ”そんなものはない”という回答も あきらめつくのでお願いします

    • ベストアンサー
    • PHP

専門家に質問してみよう