関数型言語のアルゴリズムの複雑さはどのようにモデル化されますか?


38

アルゴリズムの複雑さは、下位レベルの詳細に依存しないように設計されていますが、命令型モデルに基づいています。たとえば、ツリー内のノードへの配列アクセスや変更にはO(1)時間かかります。これは、純粋な関数型言語では当てはまりません。Haskellリストへのアクセスには直線的な時間がかかります。ツリー内のノードを変更するには、ツリーの新しいコピーを作成する必要があります。

次に、関数型言語のアルゴリズムの複雑さの代替モデリングが必要ですか?


3
これはあなたが探しているものかもしれません。
アリスタ

1
あなたの質問はここで答えられるかもしれません:cs.stackexchange.com/q/18262/755。特に、純粋に関数型の言語での時間の複雑さは、命令型言語での時間の複雑さと、比率で大きく異なりますO(logn)
DW

3
GHC Haskellは可変配列とツリーなどをサポートしているため、「状態スレッド」(STモナド)を使用して、O(1)時間で配列アクセスとツリーノードの変更を行うことができます。
タナースウェット

1
@BobJarvis依存。リストは抽象的なデータ型ですか、それともリンクリストを具体的に検討していますか?
ラファエル

1
アルゴリズムの複雑さをモデル化する目的は何ですか?数学的に純粋なもの、または実用的なものをお探しですか?実用的な価値を得るためには、利用可能な暗記があるかどうかなどに注意を払う必要がありますが、数学的純粋主義の観点からは、実装の能力は重要ではありません。
コートアンモン

回答:


34

あなたがいると仮定した場合 -calculusは、関数型プログラミング言語の良いモデルである、そして一つは考えることがあります。λ -calculusは時間の複雑さの一見単純な概念を持っている:ちょうど数カウントβ -reductionの手順をλ X M N M [ N / x ]λλβ(λx.M)NM[N/x]

しかし、これは良い複雑さの尺度ですか?

この質問に答えるには、そもそも複雑さの尺度が意味することを明確にする必要があります。1つの適切な答えは、Slotおよびvan Emde Boasの論文によって与えられます。適切な複雑さの尺度は、チューリングマシンを使用して定義される時間複雑さの標準的な概念と多項式の関係を持つ必要があります。換言すれば、「合理的な」コードがあるはずからλそのようないくつかの多項式のためのチューリングマシンへ-calculus用語Pは、それは場合は、各タームのためのMサイズの| M | Mp | M |tr(.)λpM|M|Mβ削減ステップは、 t r M がチューリングマシンの p | t r M |ステップの値に減少するときに正確にステップします。p(|M|) βtr(M)p(|tr(M)|)

長い間、これがλ計算で達成できるかどうかは不明でした。主な問題は次のとおりです。

  • 指数サイズの正規形(多項式のステップ数)を生成する用語があります。通常のフォームを書き留めるのに、指数関数的な時間がかかります。
  • 選択した削減戦略は重要な役割を果たします。たとえば、多項式の数の並列βステップ(最適なλ減少の意味)で減少するが、その複雑さは非素数(指数関数より悪いことを意味する)である項のファミリーが存在します。

紙は、「ベータ削減は確かに、不変である B. AccattoliとU.ダルラゴはジャム複雑性クラスのことをエンコードする「合理的」を示すことによって、問題を明確にすることにより、」Pと仮定して、多項式時間関数の左端の最外による呼び出し名削減を。重要な洞察は、指数関数的な爆発は、適切な共有によって打ち負かされる可能性のある「面白くない」理由でのみ発生する可能性があるということです。言い換えれば、クラスPは、チューリングマシンのステップをカウントするか、(左端から外端へ)減少をカウントして定義するかに関係なく同じです。β

他の評価戦略がどのような状況にあるのか分かりません。同様のプログラムがスペースの複雑さのために実行されたことを私は知りません。


23

アルゴリズムの複雑さは、下位レベルの詳細に依存しないように設計されています。

いいえ、そうでもありません。一部のマシンモデルでは常に基本操作をカウントします。

  • チューリングマシンの手順。
  • RAMの基本操作。

ΩΘOΘ

したがって、あなたの質問には簡単な答えがあります。機械モデルを修正し、どの「操作」をカウントするかです。これにより指標が得られます。結果を非機能的アルゴリズムと比較したい場合は、プログラムをRAM(アルゴリズム分析用)またはTM(複雑性理論用)にコンパイルし、結果を分析するのが最適です。このプロセスを容易にするために、転送定理が存在する場合があります。


同意した。サイドノート:人々、どの操作が「一定」であるかについて頻繁に多くの間違いをします。a + bであると仮定すると例えばO(1)それが本当にあるときO(log ab)
ポール・ドレイパー

3
@PaulDraperそれは別の仮定であり、必ずしも間違いではありません。必要なものをモデル化できます-質問は、興味深い質問に答えるかどうかです。こちらもご覧ください
ラファエル

「マシンモデルを取り除く」ような音非常に多くのこと
ポール・ドレイパー

@PaulDraper「マシン」という言葉に付けた感情の種類によって異なります。この議論も参照してください。FWIW、ユニットコストRAMモデル-ほぼ間違いなくアルゴリズム分析の標準モデル!- 、それ以外の場合は、今何十年も使用されなかったであろう、便利。並べ替え、検索ツリーなどの一般的な境界はすべて、そのモデルに基づいています。数値がレジスタに収まる限り、実際のコンピューターを適切にモデル化するため、これは理にかなっています。
ラファエル

1

基盤となる抽象マシンの観点から複雑さの尺度を定式化する代わりに、言語定義自体にコストを焼き付けることができます。これをコストダイナミクスと呼びます。言語のすべての評価ルールに、構成的にコストを付加します。つまり、操作のコストは、その部分式のコストの関数です。このアプローチは関数型言語では最も自然ですが、明確に定義されたプログラミング言語であれば使用できます(もちろん、ほとんどのプログラミング言語は残念ながら明確に定義されていません)。


<削除されたマシンモデルについての議論 > チャットでこの議論を続けましょう。
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.