2

障害: 複数のネストされた配列を使用し、特定の位置で最大の int を持つ配列を選択したい。選択した配列で、別の特定の位置の値を変更します。

疑似コードは次のようになります。

$array1 = array(2, 23, 7);
$array2 = array(2, 21, 7);

$Mutt = array($L, $P, $O, $array1)
$Jeff = array($L, $P, $O, $array2)

find array with max [3][1] {
('selected' [1]++)
}

Mutt ($Mutt) は今月最も多く働いており ($Mutt [3][1])、追加の「個人的な日」を獲得しています ($Mutt [1])。

私はこれに対する解決策を見つけようとしました。私は自分の検索を正しく表現する方法を理解するには新人すぎるかもしれませんが、運がありません.

4

2 に答える 2

2

問題全体にとって最大値がどれほど重要かはわかりません。これはちょっと面倒に見えます。私はこれを処理するために3つの異なる方法を考えています。

  1. 配列が変更されるたびに最大値を保持および更新する配列を作成および追加します。これはすぐに汚れてしまい、優れた解決策ではありませんが、プロジェクトの価値が高すぎる場合は問題ないかもしれません。
  2. 最高値を検索する関数を作成します。過剰ですが、機能します。
  3. もう少し高度ですが、おそらく最も専門的な解決策は、クラスを使用してプログラムを再設計することです。各配列は、独自のオブジェクトになります。各オブジェクトは、ミューテーターを使用してクラス変数の独自の最大値を追跡したり、必要に応じて更新する関数を追加したりできます。これで、これらのオブジェクトで構成された 1 つの配列を単純に持つことができ、その配列を簡単に並べ替えることができ (その値のアクセサーを使用して、各オブジェクトの最大値で並べ替える)、次に応じて配列の上部または下部からオブジェクトをプルするだけです。どのように並べ替えましたか。クラス レベルでプライベート検索関数を記述して、作成時に最大の価値を見つけたいと思うでしょう。
于 2012-08-12T19:32:32.440 に答える
2

私はあなたが望むものをよく理解していないことを願っています:

あなたの配列:

$array1 = array(2, 23, 7);
$array2 = array(2, 21, 7);

$Mutt = array($L, $P, $O, $array1);
$Jeff = array($L, $P, $O, $array2);

and (参照渡し)$peopleを含む新しい配列を作成します。$Mutt$Jeff

$people=array(&$Mutt,&$Jeff);

必要な位置で最大値を持つ配列findMaxIndexのインデックスを返す関数を作成します。$people[that index]

その引数は次のとおりです。

  • $arr、比較したい配列を含む配列 (この場合は$people)
  • $pos1$pos2、比較したいインデックスです

では・・・比較してみます

  • $arr[0][$pos1][$pos2]
  • $arr[1][$pos1][$pos2]
  • ...
  • $arr[count($arr)-1][$pos1][$pos2]

この関数は次のように機能します。

  1. 配列 を作成します$max。ここ$max[0]で、 は $arr のインデックスであり、(その時点までに調べた配列の中で) 最大値を持ち、$max[1]はその値です。
  2. すべてを繰り返します$arr
  3. 現在の値 ( $arr[$i][$pos1][$pos2]) が最大値より大きいことが判明した場合、$maxが更新され、 になり array($i,$arr[$i][$pos1][$pos2])ます。
  4. 最後に、必要な位置で最大値を持つ配列$max[0]のインデックスである を 返します。$people[that index]

機能は次のとおりです。

function findMaxIndex($arr,$pos1,$pos2){
    $max=array(0,$arr[0][$pos1][$pos2]);
    for($i=1;$i<count($arr);$i++){
        if($arr[$i][$pos1][$pos2]>$max[1]){
            $max=array($i,$arr[$i][$pos1][$pos2]);
        }
    }
    return $max[0];
}

次に、関数を呼び出します...

$maxIndex=findMaxIndex($people,3,1);

...これは を与える0ので、最大値を持つ配列は$people[0]( $Mutt)

最後に、その配列を増やします。

$people[$maxIndex][1]++;

$Mutt$Jeff参照によって渡したため、これらも変更されます。

要するに、

$array1 = array(2, 23, 7);
$array2 = array(2, 21, 7);
$Mutt = array($L, $P, $O, $array1);
$Jeff = array($L, $P, $O, $array2);
$people=array(&$Mutt,&$Jeff);
function findMaxIndex($arr,$pos1,$pos2){
    $max=array(0,$arr[0][$pos1][$pos2]);
    for($i=1;$i<count($arr);$i++){
        if($arr[$i][$pos1][$pos2]>$max[1]){
            $max=array($i,$arr[$i][$pos1][$pos2]);
        }
    }
    return $max[0];
}
$maxIndex=findMaxIndex($people,3,1);//gives `0` -> Max is `$people[0]`
$people[$maxIndex][1]++;

==============================================

また、同点の場合に複数のインデックスが必要な場合 (太字で変更):

あなたの配列:

$array1 = array(2, 23, 7);
$array2 = array(2, 21, 7);

$Mutt = array($L, $P, $O, $array1);
$Jeff = array($L, $P, $O, $array2);

$peopleを含む新しい配列の作成$Mutt$Jeff

$people=array(&$Mutt,&$Jeff);

必要な位置で最大値を持つ配列でfindMaxIndexあるインデックスを含む配列を返すfunction を作成します。$people[that index]

その引数は次のとおりです。

  • $arr、比較したい配列を含む配列 (この場合は$people)
  • $pos1$pos2、比較したいインデックスです

では・・・比較してみます

  • $arr[0][$pos1][$pos2]
  • $arr[1][$pos1][$pos2]
  • ...
  • $arr[count($arr)-1][$pos1][$pos2]

この関数は次のように機能します。

  1. 配列を作成します$max。ここで、 は $arrのインデックスを含む配列であり$max[0]、最大値 (その瞬間まで調べた配列の中で) であり、その値です。$max[1]
  2. すべてを繰り返します$arr
  3. 現在の値 ( $arr[$i][$pos1][$pos2]) が最大値より大きいことが判明した場合、$maxが更新され、 になり array(array($i),$arr[$i][$pos1][$pos2])ます。
  4. そうでない場合、および現在の値( $arr[$i][$pos1][$pos2])が最大値と等しいことが判明した場合$max[0]は、更新され、$iそこにプッシュされます。
  5. 最後に、必要な位置で最大値を持つ配列で$max[0]あるインデックスを含む配列である を 返します。$people[that index]

機能は次のとおりです。

function findMaxIndex($arr,$pos1,$pos2){
    $max=array(array(0),$arr[0][$pos1][$pos2]);
    for($i=1;$i<count($arr);$i++){
        $current=$arr[$i][$pos1][$pos2];
        if($current>$max[1]){
            $max=array(array($i),$current);
        }else if($current==$max[1]){
            array_push($max[0],$i);
        }
    }
    return $max[0];
}

次に、関数を呼び出します...

$maxIndex=findMaxIndex($people,3,0);

...これは を与えるarray(0,1)ので、最大値を持つ配列は$people[0]( $Mutt) と$people[1]( $Jeff) です。

最後に、配列を増やします。

for($i=0;$i<count($maxIndex);$i++){
    $people[$maxIndex[$i]][1]++;
}

$Mutt$Jeff参照によって渡したため、これらも変更されます。

要するに、

$array1 = array(2, 23, 7);
$array2 = array(2, 21, 7);
$Mutt = array($L, $P, $O, $array1);
$Jeff = array($L, $P, $O, $array2);
$people=array(&$Mutt,&$Jeff);
function findMaxIndex($arr,$pos1,$pos2){
    $max=array(array(0),$arr[0][$pos1][$pos2]);
    for($i=1;$i<count($arr);$i++){
        $current=$arr[$i][$pos1][$pos2];
        if($current>$max[1]){
            $max=array(array($i),$current);
        }else if($current==$max[1]){
            array_push($max[0],$i);
        }
    }
    return $max[0];
}
$maxIndex=findMaxIndex($people,3,0);//gives `array(0,1)` -> Tie between `$people[0]` and `$people[1]`
for($i=0;$i<count($maxIndex);$i++){
    $people[$maxIndex[$i]][1]++;
}
于 2012-08-12T19:52:56.180 に答える