3

並べ替えのために、PHP で考案されたコールバック関数を単純化しようとしています。

function my_sort($a, $b) {
    if($a == $b) return 0;
    return $a < $b ? 1 : -1;
}

usort に関する PHP ドキュメントによると、 equal を返すときの順序は未定義です。

これは、等価性のテストを完全にスキップできるということですか?

function my_sort($a, $b) {
    return $a < $b ? 1 : -1;
}
4

1 に答える 1

2

@lanzzが言ったように、ソート関数をそのように書くと効率が低下します。等しい要素は等しくない (= 並べ替える必要がある) と見なされるため、並べ替え関数の呼び出しの数が多くなります。

例えば:

$aops = 0;
$x = array(1, 1, 1, -1, -1, -1, 0, 0, 0);
usort($x, function($a, $b) use (&$aops) { $aops++; return $a < $b ? -1 : 1; });
var_dump($aops); // 34

$bops = 0;
$x = array(1, 1, 1, -1, -1, -1, 0, 0, 0);
usort($x, function($a, $b) use (&$bops) { $bops++; return $a === $b ? 0 : ($a < $b ? -1 : 1); });
var_dump($bops); // 17

ただし、並べ替えられた配列のすべての要素が一意であることが保証されている場合は、明らかに問題ではありません。

于 2012-10-18T15:45:59.200 に答える