2011-12-18 13 views
2

私はかつてここに@_ソートの使用法を理解し、どのようにして

sub min{ 
    (sort {$a<=>$b;} @_)[0]; 
} 

次のPerlサブルーチンを読みますか? [0]は何を表しますか?

答えて

10

(...)[0]は、括弧内のリストの最初の要素を返します。

だからあなたの例では、効果的に同じである:

sub min{ 
    my @tmp = sort { $a <=> $b } @_; # sort numerically 
    $tmp[0]; 
} 

または

sub min{ 
    my ($return) = sort { $a <=> $b } @_; # sort numerically 
    $return; 
} 

私は1つのより多くの事を指摘したいと思い、上記のコードは乱暴に非効率的です。特に大規模なソートされていないリストに。ここ

は、より賢明なアプローチである:

sub min{ 
    $min = shift; 
    for(@_){ 
    $min = $_ if $_ < $min; 
    } 
    return $min; 
} 

これは、基本的List::UtilminPure Perlバージョンに使用したのと同じアルゴリズムです。

あなたは本当にminからList::Utilを使用してください。

+0

実際には、 'List'の' PP'バージョンを見ると、 Util :: min'では、 'reduce'を使用していますが、これはむしろ非効率的です。構文的には甘いが、不必要に別のサブルーチン層をプロセスに追加する。 – Zaid

+0

@Zaidだから、私は*基本的には同じ*と書いています。ほとんどの場合、[List:Util]の[XS](http://perldoc.perl.org/perlxs.html)バージョンを実際に使用します(http://perldoc.perl.org/List/Util。 html)、これははるかに高速です。 –

+0

私はまったくあなたですが、 'List :: Util'(一般的に' XS'は利用できないことがあることを覚えておいてください)のように一般的に使用されているもの – Zaid

3

これは、パラメータをサブ配列(配列@_にある)に数値的にソートし、結果の最初の要素([0]にあります)を返します。最初の要素はすべてのargの最小値です。それらはすべて数字であることを前提としています。

+4

これは、最小値を見つけるには非効率的な方法であることに注意する価値があります。これは、少なくとも 'O(n lg n)'で最悪の場合に実行されます。時間 – bdonlan

+0

あなたはこれについてさらに詳しく記入することができますか?投稿コードはペアワイズの比較を使用しているためですか?ありがとう。 – user297850

+0

ソートは、時間(ng n)を取る。しかし、最小値はO(n)でリストを一度レースするだけで見つけることができます。あなたは一種の仕事のすべてを行う必要はありません。 –

関連する問題

 関連する問題