1

こんにちは、配列内の要素のどのグループが特定の数になるかを見つけるためのアルゴリズムまたは関数を探しています。複数ある可能性があるため、配列内の左から右への最初の適切なグループ読み取りを返したいと考えています。

たとえば、乱数の配列があるとします... $x = array(500, 90, 50, 200, 10, 300, 900) 合計すると特定の数値 X になる配列要素のグループを特定したい、1,000と言います。

この場合、配列 $x の要素 0、3、5 は、1,000 (500 + 200 + 300) までの最初の加算です。要素 1、4、6 も合計 1,000 (90 + 10 + 900) になりますが、最初ではないため、無視できます。この関数は、正しいインデックス位置 $y = array(0,3,5) を持つ新しい配列を返す必要があります。

どんな助けでも大歓迎です!ありがとう :-)

4

1 に答える 1

2

さて、これを行う「適切な」方法を見逃したかもしれませんが、それでもいくつかの解決策があります。

無限探索 - 試行 2 (推奨):

function get_parts3($arr,$target)
{
    foreach($arr as $k => $v)
    {
        if($v>$target) continue;
        foreach($arr as $k2 => $v2)
        {
            if($v2>$target) continue;
            if($k2==$k) continue;
            if($v + $v2 == $target)
            {
                return array($k,$k2);
            }
        }
        $tmparr = $arr;
        $tmparr[$k] = $target+1;
        $test = get_parts3($tmparr,$target-$v);
        if(is_array($test))
        {
            return array_merge(array($k),$test);
        }
    }
    return false;
}

試行された無限検索 1 - ただし、大きな配列ではパフォーマンスの問題が発生する可能性があります。

function get_parts2($arr,$target)
{
    foreach($arr as $k => $v)
    {
        if($v > $target) continue;
        $keys = array_keys($arr);
        for($i=0;$i<25;$i++)
        {
            $sum = $v;
            $parts = array();
            $parts[$k] = $v;
            foreach($keys as $k2)
            {
                if($k2 == $k) continue;
                $v2 = $arr[$k2];
                if($sum+$v2 > $target) continue;
                $sum += $v2;
                $parts[$k2] = $v2;
                if($sum==$target) return array_keys($parts);
            }
            shuffle($keys);
        }
    }
    return false;
}

有限検索 (この場合、2 つまたは 3 つの数字の組み合わせ) :

function get_parts($arr,$target)
{
    foreach($arr as $k => $v)
    {
        if($v>$target) continue;
        foreach($arr as $k2 => $v2)
        {
            if($v2>$target) continue;
            if($k2==$k) continue;
            if($v + $v2 == $target)
            {
                return array($v,$v2);
            }
            foreach($arr as $k3 => $v3)
            {
                if($v3>$target) continue;
                if($k3==$k2 || $k3==$k) continue;
                if($v + $v2 + $v3 == $target)
                {
                    return array($k,$k2,$k3);
                }
            }
        }
    }
    return false;
}
于 2013-08-06T10:45:06.007 に答える