[index] [text page] [<<start] [<prev] [next>] [last>>] [return]
Page 39: Schwartzian Transform

Page 39

講義の後、Tokyo.pmメーリングリストで、歌代和正さんから、「Schwartzian Transformは実行効率は良くない」と指摘を受けました。複雑なデータ構造をいじくり回すため、処理にオーバーヘッドがあります。中間変数を必要としない点は良いですが、何がなんでも中間変数を使わないという方針も考えものです。ここでは、mapgrepのようなlisp的プログラミングの例題として考えてください。上のスライド中「効率的に実行」の部分を「簡潔に記述」と読みかえていただくとよさそうです。

なお、より効率的なソートが必要な場合には、以下のようなプログラムが良いようです(perldoc -f sort参照)。この方法では、インデックスをソートし、配列スライスによって並べかえた配列を得ています。

    @nums = @caps = ();
    for (@old) {
        push @nums, /=(\d+)/;
        push @caps, uc($_);
    }

    @new = @old[ sort {
                        $nums[$b] <=> $nums[$a]
                                 ||
                        $caps[$a] cmp $caps[$b]
                       } 0..$#old
               ];

ソートに関しては、Tom Christiansenによるこんな情報もあります。Schwartzian Transformの解説も入っています。
Far More Than Everything You've Ever Wanted to Know About Sorting


Copyright (c) 1999, Kaoru Maeda. All rights reserved.
Generated by MagicPoint