2017-02-10 6 views
0

基本的なデータ構造の使い方と、パターンマッチングのパフォーマンスはどうですか?特に、Trieを検索するパフォーマンスと比較します。Erlangコンパイラ - パターンマッチングのパフォーマンスと基盤となるデータ構造

更新:私は、Erlangコンパイラによってどのようなパターンマッチングが実装されているかを簡潔かつ正確に理解しています。基礎となるデータ構造とは何ですか。パターンの検索効率はどれくらいですか?

+0

これらの質問に対する回答を参照してください: - http://stackoverflow.com/questions/586362/pattern-matching-implementation - http://stackoverflow.com/questions/2908357/how-does-pattern-matching-work -hind-the-scenes-in-f – RichardC

+0

これらのリンクを集めてくれてありがとう。私は実際にこれを投稿する前に両者を読んで、役に立つとはいえ、自分が持っていた質問に直接答えなかったと判断しました。 私はErlangがパターンマッチングを実装する方法に精通した人がこれを見て、Trieに関連する実装のアルゴリズムの複雑さを解明することを期待しています。 – suprafly

答えて

2

パターンマッチングコンパイルはそれ自体が「基本的なデータ構造」を持たず、パターンのセットに従って任意のデータ構造を分解し、一致するものがあるかどうかを判断するのに必要なステップ数を最小限に抑えるための戦略です、または一致が不可能かどうかを判定します。

入力が文字列であり、パターンがその文字列の接頭辞である場合、その動作はtrie検索と同様です。 https://en.wikipedia.org/wiki/Trieから例をとるとアーラン・ケース・スイッチとしてそれを発現する:

case String of 
    "tea" -> 3; 
    "ted" -> 4; 
    "inn" -> 5; 
    "to" -> 7; 
    "in" -> 9; 
    "i" -> 11; 
    "ten" -> 12; 
    "A" -> 15 
end 

句を複雑に全くガード表現が存在しないので、コンパイラは(種類および値によってそれらをソートする)より優れた効率のためにそれらを並べ替えるために自由です同じプレフィックスを共有するすべてのパターンが隣接するようにします。これはプログラマーにとって便利です。プログラマーは、手動でリストを整理しておくことに気にする必要はありません。

その後、コンパイラは、一連の句を最小数のテストを実行する多数のネストされた小文字の式に変換します。まず、最初の文字がAi、またはtであるかどうかをチェックします。そうでない場合は、一致するものはありません。そうでない場合は、残りの文字列を調べるために分岐します。たとえば、最初の文字がiだった場合は、次の文字がnか文字列の最後かどうかを確認します。また、どちらも一致しない場合は、一致しない可能性があります。そうでない場合は、再び分岐します。そして、すべてのパターンのすべての枝を調べるためのコードを生成します。

+0

コンパイラが生成するこれらの節はデータ構造になります。問題は、どのデータ構造が使用されているかです。もしそれが枝を探しているなら、私たちはどのような木構造を扱っていますか? ここでパターンマッチングの原則の一般的な説明はありません。 Erlangコンパイラがパターンマッチングのコンパイルをデータ構造に最適化する方法と、コンパイルされたデータ構造を検索するのに必要な時間の複雑さを正確かつ正確に理解したいと考えています。 – suprafly

+0

いいえ - 句とパターンがコードになります。検索を実行するネストされたif-then-elseの束だけです。唯一のデータ構造はケーススイッチ全体への入力です。コードを「データ構造」と見なす場合を除き、それ以外のことはあまりありません。 – RichardC

+0

拡張回答ありがとう、私の質問に答える。 – suprafly

関連する問題