4

私の要件は、配列内の最大/最大値を見つけることです。配列には、他の配列が含まれている場合があります。たとえば、以下の配列を見ることができます。

$array =
    array(
        13,
        array(10, 4, 111, 3),
        4,
        array(23, 450, 12,array(110, 119, 20, 670), 45 ,45,67,89),
        );

$max = find_max($array, 0);

print "Maximumum Value is  $max";

私はすでに実用的な関数find_maxを持っていますが、私が知りたかったのは、以下に示すコード以外でこれを行うための最良かつ効率的な方法です.

function find_max($array, $maxValue) {
    foreach ($array as $member) {
        if (is_array($member)) {
            $maxValue = find_max($member, $maxValue);
        } else {

            if($member==$maxValue){
                continue;
            }
            if ($member > $maxValue) {
                $maxValue = $member;
            }
        }
    }
    return $maxValue;
}
4

3 に答える 3

2

O(n) または線形時間よりも速く、配列 (または配列の配列) の最大値を見つけることはできません。

この配列の最大値を常に見つける必要がある場合は、配列を並べ替えるか、可能であれば別の (並べ替えられた) データ構造を一緒に使用することをお勧めします。

最大への参照を保持し、データを挿入するときに更新することもできます。明らかに、これは、データを自分で挿入し、他の場所から取得しないことを前提としています。その場合、私の最後のコメントは役に立ちません。

于 2012-08-18T05:31:44.990 に答える
1

最大値を見つけるには O(n) が必要なので、私の知る限り、大幅に改善することはできません。ただし、コードにマイナーな改善を追加できます。

function find_max($array, $maxValue) {
    foreach ($array as $member) {
        if (is_array($member)) {
            $maxValue = find_max($member, $maxValue);
        } else {
            if ($member > $maxValue) {
                $maxValue = $member;
            }
        }
    }
    return $maxValue;
}

$array =
array(
    13,
    array(10, 4, 111, 3),
    4,
    array(23, 450, 12,array(110, 119, 20, 670), 45 ,45,67,89),
    );
$ans = find_max($array, 0);
echo "ans = $ans";

出力: 670

于 2012-08-18T07:34:06.030 に答える
1

本当に、あなたがしていることは、多次元配列で最大値を検索する最良の方法です。再帰を利用して深さを見つけ、より大きな数をチェックします。申し訳ありませんが、これを行うための組み込み関数はありません。

これは、最も内側の配列に基づいて多次元配列をソートする複雑な方法ですが、かなり複雑な概念です。(それを検索します)。

usort は役に立つでしょうか?

于 2012-08-18T05:46:37.570 に答える