Я долго думал об этом. Я думаю, что логически мы можем доказать, что это невозможно сделать для общей функции сравнения comparison($a,$b)
.
При тестировании некоторой простой функции сравнения, скажем, например, >
, можно использовать переходное свойство, которое, если a > b
и b > c
, то a > c
, и, следовательно, можно каскадно искать наибольшее значение в одном проходить. Если вы хотите использовать это, чтобы найти два наивысших значения, вы можете сделать это тоже, но уже вы добавили сложность. Проверяемое число может быть больше обоих ИЛИ оно может быть только больше одного и меньше другого ИЛИ оно может быть меньше обоих. Тем не менее, это может быть учтено, как показано в этом простом сценарии.
#!/usr/bin/perl
use strict;
use warnings;
use List::Util 'shuffle';
my @array = shuffle (1..10);
my @out = (0,0); #(max, second)
map { $_>$out[0] ? ( unshift @out, $_ and pop @out) : $_>$out[1] ? $out[1] = $_ : () } @array;
print "$_\n" for @out;
Для действительно общего сравнения необходимо учитывать возможность того, что комбинация двух сравниваемых значений имеет значение, и в этом случае должна приниматься каждая парная комбинация. Фактически это НЕОБХОДИМО сделано выше, однако большинство тестов пропускаются, потому что благодаря переходному свойству мы знаем, что это безопасно.
Так что у вас это есть. Если ваш тест имеет переходные отношения, вы можете сделать что-то вроде того, что я делаю выше. Если нет, то sort
придется сделать. Парни из Perl тратят много времени на то, чтобы сделать это быстро, так что, возможно, это не так уж и плохо.