0

このコードは、要素の小さなセットに対しては正しい結果を生成しますが、大きな数のセット (100,000 要素) に対して結果が正しくない理由はわかりません。たとえば、これはcoursera の 100,000 整数テキスト ファイルです。Pythonコードからすでに正しい結果が得られています。しかし、なぜこの php コードが正しくないのかを突き止めたいと思います。出力は 2407905288 ではなく 2397819672 です。

$raw_input = file_get_contents($argv[1]);

$arr_input = explode("\n",trim($raw_input));

$count = 0.0;

function merge_sort($a)
{
    if(count($a) <2) return $a;
    $hl = count($a)/2;
    return merge(merge_sort(array_slice($a, 0, $hl)), merge_sort(array_slice($a, $hl)));

}

function merge($l, $r)
{
    global $count;
    $result = array();
    $i = $j = 0;

    while($i < sizeof($l) && $j < sizeof($r))
    {
        if($l[$i] < $r[$j])
        {
            $result[] =$l[$i];
            $i++;
        }
        else
        {
            $result[] =$r[$j];
            $count+= (sizeof($l) - $i);
            $j++;
        }
    }

    while($i <sizeof($l))
    {
        $result[] = $l[$i];
        $i++;
    }

    while($j <sizeof($r))
    {
        $result[] = $r[$j];
        $j++;
    }
    return $result;
}

$sorted = merge_sort($arr_input);

print $count . "\n";
4

3 に答える 3

1

PHPで最大の整数値に達したに違いありません。

公式ドキュメントによると:

http://php.net/manual/en/language.types.integer.php

The size of an integer is platform-dependent, although a maximum value of about two billion is the usual value (that's 32 bits signed). 64-bit platforms usually have a maximum value of about 9E18. PHP does not support unsigned integers. Integer size can be determined using the constant PHP_INT_SIZE, and maximum value using the constant PHP_INT_MAX since PHP 4.4.0 and PHP 5.0.5.

したがって、int_max 定数を変更できます。

テストされていないもの: 文字列として使用します。

于 2013-07-06T10:04:17.433 に答える
1

Pythonでもこれに遭遇したため、これは最大整数値に関連する問題ではないと思います。コードの最後の部分が

f = open('IntegerArray.txt')
unsorted = list()
for line in f:
    unsorted.append(line)
merge_sort(unsorted)

コードの最後の部分が

f = open('IntegerArray.txt')
unsorted = list()
for line in f:
    unsorted.append(int(line))
merge_sort(unsorted)

違いがわかりますか?そこに答えがあります。

于 2013-07-07T08:42:14.450 に答える