Location : Home > Languages > Perl > Package Title : Algorithm::FastPermute |
![]() |
Algorithm::FastPermute - 順列の高速計算
use Algorithm::FastPermute ('permute'); my @array = (1..shift()); permute { print "@array\n"; # あらゆる順列を出力 } @array;
Algorithm::FastPermute は配列のあらゆる順列を生成する。コードの塊を渡すとそれぞれの順列を計算する。配列は順に置き換えられ、 permute を返す前に再度置換される。コールバック実行中は配列は読み出しのみであり、その長さを変更しようとするとエラーが出る。(要素を変更することはできるが、結果はユーザを混乱させがちである。そのため将来のバージョンでは変更するかもしれない。)
リストではなく配列を渡す必要がある。特別な配列・まとまった配列ではうまく動き、特に難解なことを仕様としない限りは通常の配列に最初に要素を複写するほがよい。
非常に高速である。筆者のテストでは Algorithm::Permute の伝統的なインタフェースよりも4倍から5倍の速度である。大きなリスト(例えば9や10要素)で順列を計算すればその価値がよくわかることになるだろう。リストが短ければ Algorithm::Permute は瞬きするうちに処理を終え、インタフェースはより便利である。
実際、FastPermute インタフェース(及びコード)は今は Algorithm::Permute に含まれており、両方は必要ない。拡張とバグフィクスはここで最初に行われ、(Edwin Pratomo の判断で) Algorithm::Permute に組み込まれる。
コードは通常のサブルーチンではなく、擬似ブロック内で走る。これは return を使わないことを意味し、goto などを使って飛び出ることができない。また caller はコールバック内では役に立つことをしてくれない。それは速度の代償である。
順列の並びは必ずしも保証されないので信頼しないこと。
permute 関数がデフォルトではエクスポート可能である。
Robin Houston, <robin@kitsite.com>
Matt Day の C プログラムに基づく。
Copyright (c) 2001-2002, Robin Houston. All Rights Reserved.
本モジュールはフリーソフトウェアであり、Perl 本体と同等の条件で利用・再配布・修正してもよい。
![]() |
Updated : 2007/04/17 |