最初に別のアルゴリズムを見つけることによって関数を計算するアルゴリズムの概念はありますか?


14

私はそれを正しく理解していれば、実際の関数の値を計算するアルゴリズム、計算の複雑さを持っている以下に保持している場合:我々は計算すると精度にのために必要との手順。O G N F δ G N fOgnfδg(n)

しかし、私たちがアルゴリズムを持っている場合、最初は「計算するために、より効率的なアルゴリズムを見つけること」、その後、計算?fff

言い換えると、次のことを行うアルゴリズムがある場合はどうAなりますか。

  1. fを計算するための効率的なアルゴリズムBを見つけます。f

  2. ユースB計算にf

その場合、アルゴリズムAがすでにアルゴリズムBを見つけたかどうかに完全に依存するため、たとえばを計算するのにかかる計算時間について話すことはできません。換言すれば、計算時間は、計算に必要なF 5 場合5は、第一comoputed数を計算するのに必要な計算時間よりもはるかに大きいであるF 5 の後にF 3 既に計算されています。f(5)ABf(5)5f(5)f(3

私の質問は、関数を計算する前に最初に別のアルゴリズムを見つけるこの種のアルゴリズムに関する概念/理論はありますか?具体的には、このようなアルゴリズムの計算の複雑さの分析について疑問に思っています。


1
Mathematicaは基本的にあなたが求めていることをするということでしょうか?解く方程式を指定すると、それらの方程式を解くために使用するアルゴリズムが自動的に計算され、それらが解かれます。
user541686

itu.dk/people/sestoft/pebookをチェックしてください。これは関連性があります。
ネイサンリンゴ

回答:


18

よく知られているアルゴリズム、レビンのユニバーサル検索アルゴリズムがあり、その動作モードは同じです。たとえば、満足できることが保証されている式の満足のいく割り当てを見つける問題を考えてみましょう。Levinのユニバーサル検索は、すべての潜在的なアルゴリズムを並行して実行し、いずれかのアルゴリズムが満足のいく割り当てを出力する場合、この割り当てを停止して出力します。問題の最適なアルゴリズムが時間で実行される場合、レビンのアルゴリズムは、正しく実装されていれば時間O f n (おそらくは非常に大きな定数)で実行されます。fnO(f(n))

Levinのアルゴリズムは(関連する巨大な定数のために)実用的ではありませんが、理論的には非常に興味深いものです。ユニバーサル検索の詳細については、Scholarpediaの記事を参照してください。


10

我々は機能があるとf引数取るxタイプのをA、引数取る別の関数出力yタイプのをBとタイプの結果を返しますC。つまり、f引数xを取り、タイプの入力を取り、タイプのB結果を出力する「アルゴリズム」を返しますC

関数にfは次の型があります

A → (B → C)

実際、x : Atypeの関数を受け取って返しますB → C。しかし、このようなANは、f機能と同等ですg : A × B → C取るの両方を xし、y一度、あなたの最終的な結果を提供します。確かに、型の間には同型があります

A → (B → C)

そして

A × B → C

私たちは、定義することができますので、gの観点fとして、

g(x, y) := f(x)(y)

そして、私たちは定義することができるfという点でgなど

f(x) := (y ↦ g(x,y))

からgに渡す操作はカリー化f呼ばれ、関数型プログラマーは常にそれを使用します。計算可能性理論では、1つの入力を取り、関数(アルゴリズム)を出力するという考え方がsmn定理に組み込まれています。

あなたの質問への答えは「はい、人々はいつもこれをします」です。しかし、道徳もあります:アルゴリズムを見つけるアルゴリズムは、まだ単なるアルゴリズムです。


1
その最後の文に+1。よく言った。
ジョンコールマン

f5c+ccf5f5c1+c2c1c2c1>c2

@ Programmer2134コンパイラの最適化はあなたが興味を持っている概念ですか?私はすべての(複雑性理論では特にその相互作用)で、この背後にある理論がわからないんだけど、これは潜在的な例かもしれない
マーク

探すべき流行語は「部分評価」です。
アンドレイバウアー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.