dbo:abstract
|
- シュワルツ変換(シュワルツへんかん、英: schwartzian transform)は、リストの要素のソートを効率良く行うためのプログラミングの手法の一つである。このイディオム は、要素の順序が実際には要素のあるプロパティ(キー)の順序に基づいていて、キーの計算に多くの計算資源を要するため計算回数を最小限にしたい状況で行う比較ソートに適している。シュワルツ変換の特徴として、名前付きの一時配列を使わないことが挙げられる。 シュワルツ変換は LISP において decorate-sort-undecorate(DSU)として知られるイディオムの一種であり、一時的に入力要素とキーを関連付けることでキーの再計算を避けるイディオムである。このアプローチはメモ化に似ていて、メモ化では特定の入力値に関連しているキーの再計算を避けている。比較すると、シュワルツ変換は各入力要素のキーを計算回数が厳密に一度であることを保証する。ただし、入力要素に重複がある場合、同値な要素に対して複数回キーの計算を行う。 シュワルツ変換の名はランダル・L・シュワルツ(Randal L. Schwartz)に因む。シュワルツは Perl 5 リリース直後の1994年にこのイディオムを Perl で初めて実装した。「シュワルツ変換」の語は専ら Perl の文脈でのみ用いられてきたが、後に Python など他のプログラミング言語のユーザの間でも、類似のイディオムに言及する際に用いられるようになった。しかしこのアルゴリズムは、シュワルツによる特定のイディオムとして Perl コミュニティの間で普及するより以前に、既に他の言語で(特定の名前を与えられずに)用いられている。「シュワルツ変換」の語は特定のイディオムを示すのであって、一般のアルゴリズムを示すのではない。 例として、リスト ("aaaa","a","aa") を各語の長さに基づいて並び替えることを考える。まず文字列と長さの配列からリスト (["aaaa",4],["a",1],["aa",2]) を生成し(decorate)、次にタプルの数値に基づいてこのリストをソートし (["a",1],["aa",2],["aaaa",4]) を得て(sort)、最後にソート済みリスト要素から数値を取り除き(undecorate)、目的のリスト ("a","aa","aaaa") を得る。このアルゴリズムの Perl での実装を以下に示す: @sorted = map { $_->[0] } sort { $a->[1] <=> $b->[1] or $a->[0] cmp $b->[0] } # 先に長さを比較し、長さの等しい場合のみ文字列の比較を行う map { [$_, length($_)] } # 文字列の長さを計算する @unsorted; (ja)
- シュワルツ変換(シュワルツへんかん、英: schwartzian transform)は、リストの要素のソートを効率良く行うためのプログラミングの手法の一つである。このイディオム は、要素の順序が実際には要素のあるプロパティ(キー)の順序に基づいていて、キーの計算に多くの計算資源を要するため計算回数を最小限にしたい状況で行う比較ソートに適している。シュワルツ変換の特徴として、名前付きの一時配列を使わないことが挙げられる。 シュワルツ変換は LISP において decorate-sort-undecorate(DSU)として知られるイディオムの一種であり、一時的に入力要素とキーを関連付けることでキーの再計算を避けるイディオムである。このアプローチはメモ化に似ていて、メモ化では特定の入力値に関連しているキーの再計算を避けている。比較すると、シュワルツ変換は各入力要素のキーを計算回数が厳密に一度であることを保証する。ただし、入力要素に重複がある場合、同値な要素に対して複数回キーの計算を行う。 シュワルツ変換の名はランダル・L・シュワルツ(Randal L. Schwartz)に因む。シュワルツは Perl 5 リリース直後の1994年にこのイディオムを Perl で初めて実装した。「シュワルツ変換」の語は専ら Perl の文脈でのみ用いられてきたが、後に Python など他のプログラミング言語のユーザの間でも、類似のイディオムに言及する際に用いられるようになった。しかしこのアルゴリズムは、シュワルツによる特定のイディオムとして Perl コミュニティの間で普及するより以前に、既に他の言語で(特定の名前を与えられずに)用いられている。「シュワルツ変換」の語は特定のイディオムを示すのであって、一般のアルゴリズムを示すのではない。 例として、リスト ("aaaa","a","aa") を各語の長さに基づいて並び替えることを考える。まず文字列と長さの配列からリスト (["aaaa",4],["a",1],["aa",2]) を生成し(decorate)、次にタプルの数値に基づいてこのリストをソートし (["a",1],["aa",2],["aaaa",4]) を得て(sort)、最後にソート済みリスト要素から数値を取り除き(undecorate)、目的のリスト ("a","aa","aaaa") を得る。このアルゴリズムの Perl での実装を以下に示す: @sorted = map { $_->[0] } sort { $a->[1] <=> $b->[1] or $a->[0] cmp $b->[0] } # 先に長さを比較し、長さの等しい場合のみ文字列の比較を行う map { [$_, length($_)] } # 文字列の長さを計算する @unsorted; (ja)
|