関数型プログラミング言語の実装に関するアルゴリズムの複雑さの分析


10

今日、アルゴリズム分析は計算モデルに基づいて異なることを学びました。それは私が考えも聞いたこともないものです。

User @chiが私に与えた、それをさらに説明する例は次のとおりです。

たとえば、タスクを考えてみましょう:x iを返し ます。RAM では 、配列アクセスが一定時間であるため、これはO 1 で解決できます。TMを使用して、入力全体をスキャンする必要があるため、O n )です。(i,x1,,xn)xiO(1)O(n)

これは、関数型言語について不思議に思います。私の理解から、「関数型言語はラムダ計算に密接に関連しています」(ここでの Yuval Filmusのコメントから)。では、関数型言語がラムダ計算に基づいているが、RAMベースのマシンで実行されている場合、純粋に関数型のデータ構造と言語を使用して実装されたアルゴリズムで複雑さ分析を実行する適切な方法は何ですか?

私は純粋に機能的なデータ構造を読む機会がありませんでしたが、件名についてWikipediaのページを確認しました。データ構造のいくつかは、従来の配列を次のものに置き換えているようです。

「配列は、純粋に機能的な実装を認めるマップまたはランダムアクセスリストに置き換えることができますが、アクセスと更新の時間は対数です。」

その場合、計算モデルは異なりますよね?


3
O(logn)O(logn)n

1
O(1)

1
異なる計算モデルの例は、ラムダ計算の項で行われるベータ削減の数です。FPでは、それが理にかなっている場合、ラムダ計算としてドレスアップされたramモデルを使用するのがより重要です
カートミューラー

1
O(2n)O(n)

1
また、関数型言語が積極的であるか、遅延であるか、厳密であるか、厳密でないかを知る必要があることに注意してください。私は最近、現実世界のアルゴリズムがHaskell(非厳密)で多項式である状況に遭遇しましたが、OCaml(厳密)への単純な変換は指数関数的でした。
Eric Lippert

回答:


6

関数型言語のセマンティクスによって異なります。ステートメントの実際の意味がわからないため、プログラミング言語のアルゴリズム分析を単独で行うことはできません。言語の仕様では、十分に詳細なセマンティクスを提供する必要があります。あなたの言語がラムダ計算の観点からすべてを指定している場合、削減のためのいくつかのコスト測定が必要です(それらはO(1)ですか、それとも、削減する用語のサイズに依存しますか?)。

ほとんどの関数型言語はそのようにせず、代わりに「関数呼び出しはO(1)、リストの先頭に追加するのはO(1)」のようなより有用なステートメントを提供すると思います。


私はあなたの答えをある程度理解していると思います(誤解はラムダ計算での私の理解の欠如が原因である可能性が高いです):あなたは基本的にケースバイケースで(ケースは言語で)分析する必要があると言っています特定の操作は言語ごとに異なる意味を持つため、一般的な方法。私の理解は正しいですか?
Abdul

はい。言語設計者は、アルゴリズムの実行時間を分析する前に、言語で記述できることの実際の意味を伝える必要があります。
adrianN 2016

「プログラミング言語のアルゴリズム分析を単独で行うことはできません」-これはFP言語に関するものですか、それとも一般的な言語に関するものですか?それが以前のものを参照していた場合、学校でそのような一般的な方法でアルゴリズム分析をどのように行うか、つまり、Java、C / C ++、Pythonの問題全体で分析を行うのでしょうか。それらはすべて非常に似ているからですか?それとも、基礎となるデータ構造とADTがすべて同じであり、同じ方法で実装されているためでしょうか。または最後に、これらのコースは単に教育のためのものであり、必ずしも厳密に正確である必要はないためですか?
Abdul

1
すべてのプログラミング言語に当てはまります。厳密に正しくするには、最初にマシンモデルを修正する必要があります。たとえば、RAMとそれがサポートする命令(ほんの一握り)を言ってください。これらの命令のみを使用してプログラムの分析を行うことができます。次に、プログラミング言語のそのマシンモデルへのマッピングを考えることができます。その後、プログラミング言語でプログラムを分析できます。非常に厳密な扱いについては、Art of Computer ProgrammingでKnuthがどのように行うかを確認してください。ビッグO隠蔽定数のため、これの多くは単純化できます。
adrianN 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.