アルゴリズムとは正確には何ですか?


12

私はこれが箱から出して少し聞こえるかもしれないことを知っています、実際、私はいつも箱の中を考えていましたが、最近、コンピューター科学が高い自由度を提供するため、大学で教えられたもの。

階乗関数を考えます。通常、この関数は次のように定義します

 int fact(int n) 
 { 
 int r = 1; 
 for(int i=2;i<=n;i++) 
 r = r*i; 
 return r; 
 } 

これをアルゴリズムと呼び、これが正しい方法であることは間違いありません。次に、「これを一定時間で行うことができますか?」と思いましたが、これは次のアイデアを可能にします:array [n]がnの階乗を格納する整数の配列があったらどうなりますか?この配列がいっぱいになると、次のようにファクトを単純に定義できます。

 int fact(int n) 
 { 
 return array[n]; 
 } 

それでも、正しい結果を提供し、一定の時間O(1)で動作するにもかかわらず、このアルゴリズムを調整することはできません。これをアルゴリズムと呼べますか?そうでなければ、なぜですか?配列を埋めるために脳内にある場合でも、配列を埋めるにはある時点でアルゴリズムが動作する必要があると主張できますが、これが基準になるのでしょうか?これらの側面は正式にどのように扱われますか?

この概念は、引数の数に関係なく整数で動作する任意の関数に拡張できることに注意してください。関数に2つの引数がある場合は行列を使用する必要があり、関数に3つの引数がある場合は3を使用する必要があります。また、これらのソリューションは単にメモリ消費のために使用されていませんか?

また、プログラムが提供する可能性のあるすべての出力をインデックス化する方法を見つけることができるため、その機能が出力を持つプログラムを包含することもありません。

別の例として、配列の一般的な使用法を考えてみましょう。最初にサイズNの配列を割り当て、次にインデックスnに値を格納し、nを1単位増やして配列に要素を追加します。次に、要素を探したい場合は、配列に対して線形検索を実行するしかありません。代わりに、ゼロで初期化された整数を格納するためのサイズの配列、たとえばInteger.MAXVALUEを作成した場合、そのインデックスに1を置くことで整数を格納できます。次に、O(1)時間で配列内にその存在を検索できます。同じ番号の複数のユニットを配置できるようにしたい場合はどうすればよいですか?問題ありません。整数のインデックスに格納されている値を増やすだけです。

ソートはもう少し複雑になりますが、それでもルックアップと追加はO(1)時間で実行できます。


2番目の関数には、パラメーターとして配列が必要です。そうしないと、暗黙的な状態の命令型トラップで迷子になります。これはプログラミングには役立ちますが、コードの推論が非常に困難になる可能性があります。
jmite 14年

はい、2番目のコードは、入力が数値nであり、すべての階乗を含む配列であるアルゴリズムと呼ばれます。最初のコードでは、アルゴリズムの入力は1つ、つまり数値nのみです。
アンクール14年

必須:私は、今日、その簡略表記["アルゴリズム"]に含まれると理解している素材の種類をさらに定義しようとはしません。しかし、私はそれを見たときにそれを知っており、以下の投稿で説明されていることはそうではありません。
Patrick87 14年

この質問に関連して(ただし、直接答えるわけではありません)、「アルゴリズムとは」を読むことも興味深いです。Yuri Gurevich、マイクロソフトリサーチ、テクニカルレポートMSR-TR-2011-116 research.microsoft.com/pubs/155608/209-3.pdf
godfatherofpolka 14年

「...... array [n]がnの階乗を格納する整数の配列があったらどうなるでしょうか?この配列が満たされると...」配列をすべての整数の階乗でどのように埋めますか?この配列のサイズは無限であり、いっぱいになるまで無限の時間がかかります。したがって、あなたの質問は不適切です。
AP 14年

回答:


9

一般的な教科書のアルゴリズムの非公式の定義は次のようになります。

アルゴリズムは、(1)明確に定義された計算手順(2)入力を受け取り、(3)明確に定義された計算問題の出力(4)を生成します。

最初のケースでは、アルゴリズムをコーディングしました:問題は、入力としてint n(定義のパート2)が与えられた階乗(定義のパート4)を見つけることです、コードは実行される計算を記述します(定義のパート1) )、出力は階乗です(定義のパート3)。

2番目の場合:問題は、nを入力(定義のパート3)として与えられた位置n(定義のパート4)で配列要素を見つけることです。コードは実行される計算(定義のパート2)を記述し、出力は、位置nの要素です(定義の第1部)。

階乗を格納しているので、階乗を与えます。そこに正方形または立方体を保存していた場合、正方形または立方体が得られるため、2番目のスニペット自体が階乗を計算するアルゴリズムであるとは言えません。

そして、配列nが位置nにf(n)を持つ配列と一緒にルックアップすると言うと、f(n)を計算するためのアルゴリズムであるため、これ以上計算ができないほど深くなりました。適切に定義された計算手順は、有限の情報でなければなりません。階乗の無限配列が計算手順の一部である場合、これは成り立ちません。そのため、階乗を計算するアルゴリズムにはなりません。


OPの提案の本当の問題は、「明確に定義された計算手順」の記述が有限ではないことです。もちろん、「明確に定義された計算手順」の意味を説明しない限り、OPのアルゴリズムが合法かどうかを前もって知ることはできません。実際には、無限配列が与えられた「明確に定義された計算手順」であるため、なぜこれが違法なのでしょうか?OPは、配列にデータを取り込む方法を有限の用語で説明することもできます。それから何がうまくいかないのですか?非公式の定義では、ハイパー計算と(チューリング)計算を区別できません。
ユヴァルフィルマス14年

明確に定義された計算手順は、有限の情報として表現可能でなければなりません。階乗の無限配列がその一部である場合、これは成り立ちません。
ランビル14年

2
OPが実証したように、有限の情報として表現できます。配列はすべての階乗で初期化されます。これは有限の説明です。動作上有限ではありません。同様に、有限ことなく有限の記述を有します。{nnnN}
ユヴァルフィルマス14年

配列の記述は有限の情報として表現できますが、配列自体はそうではありません。
ランビル14年

OPの例はどちらもアルゴリズムであり、すべての整数の階乗を計算しないと主張します。しかし、それはただうるさいだけだと思います。
Patrick87 14年

5

最も広く言えば、アルゴリズムは問題を解決するための一連のステップです

CSでは、アルゴリズムという用語を使用する場合、一般的に次のことが理解/想定されます。

  • このアルゴリズムには、問題のインスタンスが与えられた場合にそのステップを実行するための有限の説明と明確な手順があります。(以下で詳しく説明します。)
  • 有限文字列(入力シンボルのシーケンス)として与えられた問題のインスタンス、およびアルゴリズムの出力は、有限文字列としてエンコードできます。
  • 問題とは、問題インスタンスのコレクションと、各インスタンスの可能な「正しい」出力です。「解決する」とは、正しい出力を生成することを意味します。
  • (通常)問題のインスタンスは任意に大きくなる可能性があります(有限アルゴリズムが解決しなければならない可能性のあるインスタンスの数は無限です)。

CSが設立される前は、数学者はあなたが提起するのと同じタイプの懸念を持ち、これらの懸念に対処するための計算の正式な定義を導入しました。したがって、今日では、「アルゴリズムはチューリングマシンで実装できる手順である」と単純に言うことで、上記のすべての仮定を形式化できます。これはおそらくあなたの質問に対する最良の正式な回答でしょう。

Church-Turingの論文では、チューリングマシンほど「強力な」アルゴリズムの形式化はないと考えていることに注意してください。

階乗の例は、不均一計算と呼ばれる異なる計算モデルに入ります。チューリングマシンは、均一な計算モデルの例です。単一の有限な記述を持ち、任意の大きなサイズの入力に対して機能します。つまり、すべての入力サイズの問題を解決するTMが存在します。

これで、代わりに次のような計算を検討できます。各入力サイズに対して、問題を解決するTM(または他の計算デバイス)が存在します。これは非常に異なる質問です。TMには有限の記述があるため、単一のTMがすべての整数の階乗を格納できないことに注意してください。ただし、1000未満のすべての数値の階乗を格納するTM(またはCのプログラム)を作成できます。その後、1000〜10000のすべての数値の階乗を格納するプログラムを作成できます。

これらの不均一なタイプの計算は、通常、理論的なCSで回路によってモデル化されます。入力可能なサイズごとに異なる回路構成を検討します。

計算の非均一モデルは、私の最初の文に合うかもしれませんが、一般にアルゴリズムは見なされません。理由は、これらが主要な仮定に適合しないためです。入力サイズの「全体」問題を解決するために実装できる有限の説明がありません。むしろ、問題が大きくなるにつれて、より大きな説明が必要になります(より大きなルックアップテーブルが必要になるなど)。ただし、それらは依然として興味深い計算モデルです。


回路ベースの計算モデルは不適切だと思います。あなたが言うように、TMには有限の記述があります。しかし、それは要因の表形式バージョンで満たされた補助テープを持つことを排除しません。「さらに悪い」ことをすることもできますが、それでも有限の説明があります。しかし、実際に必要なのは計算可能な記述であり、それは必然的に有限です。集計された階乗を使用してチューリングマシンを定義する多くの計算的に均一な方法がありますが、TMの計算能力を実際に向上させることはできません。したがって、あなたの結論は成り立ちません。
babou 14年

@babou、私はあなたが何を意味するのか理解できません。「不適切」とはどういう意味ですか。どの結論が間違っていると思いますか?注:回路モデルは発明しませんでした。おそらく私はそれを説明する良い仕事をしなかった。重要な点は、入力ごとに異なる計算デバイス(TMまたは回路)を使用できることです。つまり、これらのすべてのデバイス(すべての入力サイズ)を生成する統一アルゴリズムがない場合があります。それらすべてを説明する明確な説明はありません。
usul 14年

階乗関数の表を不均一な計算として見ることは、適切な方法とは思えません。それは実際には非常に均一であり、その有限セグメントは、テーブル全体である無限大の限界で連続しているように見える程度までです。それがスコットのセマンティクスで行われていることです。さらに、実際にテーブル全体を計算可能な方法で有限に記述することができるため、事前計算済みのテーブルを含む追加のテープを備えたTMを考慮することは計算上意味があります。あなたの答えは、事前に計算されたテーブルをアルゴリズムと見なすことはできないと結論付けているようです。
babou 14年

特定の事前計算済みテーブルはアルゴリズムの一部である可能性があり、サイズがますます大きくなる事前計算済みテーブルの無限シーケンスの場合、アルゴリズムを使用してこれらのいずれかを生成できます。しかし、サイズが無限であるため、サイズが増加する無限のルックアップテーブルを、それ自体がアルゴリズムまたは均一な計算とは見なしません。
usul

あなたはそれをアルゴリズムとは思わないでしょう。これは主観的です。重要なのは、なぜすべきではないかを知ることです。そして、私が見ることができる理由はありません。その場合、アルゴリズムにとって意味のある概念は意味を持ち続けます。テーブルの作成を抽象化するだけですが、個別に説明することもできます。実際、これは純粋にセマンティクスの問題です。なぜなら、増加するシーケンス自体を考慮するか、無限の制限で置き換えると、数学的に同じになるからです。そして、計算のセマンティック理論は、このような無限の制限を考慮しますが、生成または表現されます。
babou 14年

4

アルゴリズムは、Cで記述されたプログラムであり、任意の長さの入力に対して機能するはずです(無限のメモリと無制限の整数を想定)。あなたの例では、すべての長さの入力に対してプログラムを動作させたい場合、結果が保存されるテーブルは無限に大きくなります。Cのプログラムは常に有限であるため、このアプローチは使用できません。

nn)はCに比べてはるかに効率的に計算できます。

実際のコンピューターでの実際の実行時間について心配するときは、さらに注意する必要がありますが、残念ながら、これは通常、理論的なコンピューターサイエンスの限界を超えています。


nn

どのようなアルゴリズムの概念を使用すべきですか?上記で概説した1つの提案は、Cプログラムを使用することです。この概念をC計算と呼ぶことができます。チューリング計算は、チューリングマシンを使用するときに得られるものです。関数がチューリング計算可能な場合にのみ、関数がC計算可能であることがわかります。この意味では、これらの計算モデルは両方とも同等です。実際、他の多くのモデルは同等です。たとえば、一般的に使用されるすべてのプログラミング言語(無限のメモリと無制限の変数を想定)です。

プログラミング言語Pがチューリング完全であると言うのは、チューリング計算可能な場合に限り、関数はP計算可能です。チャーチ・チューリング仮説は、有限の記述を持ち、有限の時間を要するすべての合理的な計算モデルがチューリング完全であるという効果に対する非公式の声明です。モデルには有限の記述がありますが、有限の時間はかかりません。


3
lol「アルゴリズムはCで書かれたプログラムです...」?!?
vzn

2
「アルゴリズムはCで書かれたプログラムです」...言語を指定する理由は何ですか?それは無意味です。
nouney

1
@nouney私はただ具体的になろうとしています。お気に入りのプログラミング言語もチューリング完全です。
ユヴァルフィルマス14年

@YuvalFilmusまあ、あなたは具体的ではなく、混乱しています。
nouney

@nouney独自の回答を追加してください。
ユヴァルフィルム14年

4

欠けているアルゴリズムの一般的な定義の重要な部分は、仕様が有限でなければならず、仕様のサイズが入力のサイズによって変化してはならないことです。

メモリは任意に大きく、入力も可能ですが、アルゴリズムの有用な定義であるために、コードスペースは有限でなければなりません。そうでない場合は、特定したばかりの問題が発生します。

OログAAOログnOログnOnログn2sn=O2sO2s s2O1


コード空間は有限でなければなりません」:eval作成したばかりの大きなデータ構造で関数を呼び出すLispプログラムは、lLisp式を表しますが、アルゴリズムとは見なせないということですか。20世紀にMITで作成されたコードの多くはアルゴリズムとしての資格がないと思われます。これは単なる非公式の議論ですが、形式的な問題は有限仕様とは何かという観点にあります。
babou

式が生成された場合、それは有限です。どんなに大きくても。ただし、コードスペースの有限性の制限を解除することは有用であり、実行時の下限を証明するために使用できます(リストソートの実行時の下限を証明するなど)。しかし、アルゴリズム自体の興味深い結果には、ほとんど有限のコードスペースが必要です。多項式が有限数の係数を持たなければならないことに似ていますが、べき級数も有用です。
ダニエルV 14年

私は複雑さを計算する方法についての専門家ではありません(私の分野ではありません)が、それを行うための数学を持っているか持っていないという事実は、アルゴリズムとは何にも影響しません。重要なのは、Lispプログラムはコードのサイズを制限なく増やすことができるということです。次に、これを特定の計算特性を持つ無限のコードとして分析する方が理にかなっています。表形式関数の場合は、その観点から見ることができます。答えには、アルゴリズムが何であるかについてのそのような限られた(私は偏狭と言っていた)ビューがあることに驚いています。
babou 14年

3

役に立つかもしれないいくつかの観察:

問題は、許容される入力と対応する出力に関する記述です。それらは私たちが解決したいものです。アルゴリズムは計算手順です。問題に関して許容される入力を受け入れ、問題の説明に従って出力を生成する場合、アルゴリズムは問題に関して正しいと言えます。

どちらの例もアルゴリズムであり、どちらも明らかに計算手順です。アルゴリズムが正しいかどうかは、問題の定義方法とアルゴリズムの表現の解釈方法によって異なります。いくつかの問題ステートメント:

  1. nn
  2. n>0n< INT_MAXn

最初のコードスニペットのいくつかの解釈:

  1. これは、詳細を除いてC / C ++に似た擬似コードです。intたとえば、実際には「任意の整数」を意味します。
  2. これは、実際のC / C ++プログラムであるかのように解釈されます。

解釈1が問題文1に対して正しいのは、階乗が負の数値に対して値1を想定している限りです(そうでなければ、問題文を修正してドメインを制限したり、アルゴリズムが目的の動作を説明できます)。解釈2は、問題文2に対して正しいものですが、同じ注意事項があります。

arrayarraynn>0n< INT_MAXnn<0

nn232n264

kknknk+n


アルゴリズムの概念は、コンピューターのワードサイズの制限をいくらか超えていると思います。私はあなたが問題を避けているだけだと感じています。
babou 14年

1

このアルゴリズムは、で書かれたプログラムであるチューリング完全言語のすべての有効な入力で証明可能停止していること。すべての標準プログラミング言語はチューリング完全です。この言葉は、ペルシャの数学者、天文学者、地理学者であるal-Khwārizmīという名前のヨーロッパ翻訳に由来します。

質問は、基本的にルックアップテーブルがアルゴリズムの一部であるかどうかに関するもののようです。絶対に!チューリングマシン(TM)のテーブルは、TMの状態テーブルで符号化することができます。TMは、遷移テーブルに格納されている有限量のデータに基づいてテープを初期化できます。ただし、無限入力では実行されず、有限入力のみで実行される「アルゴリズム」は、「自明」な有限状態マシン(FSM)です。


3
TUringの完全な言語である必要があるのはなぜですか?
babou 14年

1

一言で言えば:アルゴリズムは、与えられた問題に解決策があるという建設的な証明の建設的な部分です。この定義の動機は、プログラムと問題の間のカリー-ハワード同型であり、プログラムが問題を解決する場合にのみ関心を持っているが、そのように証明できることを考慮しています。この定義により、より多くの抽象化が可能になり、関係する可能性のあるドメインの種類、たとえば有限性に関するいくつかの扉が開かれます。

警告私は質問に答えるための適切な正式なアプローチを見つけようとしています。私はそれが必要だと思いますが、これまでに答えたユーザーは誰も(自分自身を含めて、他の投稿でそれについて多かれ少なかれ明示的でした)、建設的な数学、証明理論、型理論、および証明とプログラムの間のカリー-ハワード同型などの結果。私は自分が持っている(信じている)知識の断片を使って、ここでベストを尽くしていますが、この答えの限界にしか気づいていません。私は、答えがどのように見えるべきであると思うかについて、いくつかのヒントを与えたいだけです。正式に(間違いなく)明らかに間違っている点を見つけた場合は、コメントまたはメールでお知らせください。

いくつかの問題を特定する

アルゴリズムを検討する標準的な方法は、アルゴリズムがメモリに制限のないものも含め、何らかのコンピューティングデバイス用の任意の有限指定プログラムであることを述べることです。言語はコンピューターの機械語でもあります。実際、チューリングの完全なコンピューティングデバイスのすべてのプログラムを検討するだけで十分です(これは、メモリの制限がないことを意味します)。すべてが何らかのエンコーディングまで定義されているため、理論的にも、解釈コンテキストに詳細に依存する形式でアルゴリズムを表現する必要があるという意味で、すべてのアルゴリズムのプレゼンテーションを提供するわけではありません。ただし、計算対象のすべてを計算するため、エンコードまでのすべてのアルゴリズムが何らかの形で含まれます。

この定義は正しいことですが、役に立つのでしょうか?あんまり。このようなコンピューターは、説明を簡単にするためにバイナリコンピューターと見なされているため、任意の有限のバイトシーケンスをメモリに格納して実行を開始できます。あなたは何かを計算します。さて、多くの場合、空の出力です。運がよければ、の小数の無限列挙を取得しますπにより示唆されるように、おそらく、または@hirschhornsalzサービスパック6およびWindows 9を含むWorld of Warcraftのは、Microsoft Officeの17のような宝石。何が起こっても、それはいつか何かを計算し、おそらくすぐに停止するか、出力の有無にかかわらず永遠に計算します。

問題は、任意のビットシーケンスを取得し、それをアルゴリズムとして、あるコンピューターのプログラムとして見ることができるということです。しかし、それが何を計算するのかわからない場合、それはまったく役に立ちません。の小数のように見えるかもしれませんπが、エラーが頻繁に含まれています。これはBorgesのBabelのライブラリに似ていますが、アルゴリズムのコードにサイズ制限がなく、それらが有限であることだけが悪いのです。主な違いは、Borgesのライブラリは有限である(書籍のサイズが固定されているため)が、アルゴリズムの数は数え切れないほど大きいことです。意味のあるアルゴリズムは非常に少なく、バグのあるものでさえ、ボルヘスのライブラリにある意味のある本はそうです。実際、私は何らかの形で、ほとんどすべてのアルゴリズムが面白くないと推測します、おそらくほとんどすべての数学的な意味で。しかし、それは定義の精度を高める必要があります。

したがって、本当の問題は、意味のあるアルゴリズムとは何かを知ることです。答えは、意味のあるアルゴリズムは問題を解決するものであり、その問題の「解決策」、「答え」を段階的に計算することです。アルゴリズムは、解決する問題に関連付けられている場合に興味深いです。

正式な問題が与えられた場合、その問題を解決するアルゴリズムをどのように取得するのでしょうか。明示的であれ暗黙的であれ、アルゴリズムは問題の解決策が存在するという考えに関連付けられており、それは正しいことが証明されます。私たちの証明技術が正確であるかどうかは別の問題ですが、私たちは少なくとも自分自身を納得させようとします。実際に私たちがしなければならないことであり(そしてほとんどの数学にとって非常に受け入れられる公理的制約である)建設的な数学に自分自身を制限する場合、解決策の存在を証明する方法は実際に構造を示す証明ステップを経ることですそれは、ソリューションを表します。おそらく、それを正しさを確立する他の手順も含まれます。

すべてのプログラマーは次のように考えます:データをそのような方法でいじると、セサミの定理のために適切なプロパティを持つこのウィジェットを取得し、このfooを維持する変換を実行すると、望ましい答えが得られます。しかし、その証拠は通常非公式であり、すべての詳細を解明しているわけではありません。これは、衛星が火星の地下を周回しようとした理由を説明しています。多くの推論を行いますが、実際にはソリューションを構築する建設的な部分のみを保持し、コンピューター言語で問題を解決するアルゴリズムであると記述しています。

興味深いアルゴリズム(またはプログラム)

これはすべて、次のアイデアを紹介することでした。これは、現在の多くの研究の対象です(私は専門家ではありません)。ここで使用される「興味深いアルゴリズム」の概念は私のもので、より正確な定義のための非公式のプレースホルダーとして導入されています。

興味深いアルゴリズムは、与えられた問題に解決策があるという建設的な証明の建設的な部分です。つまり、証明は、たとえば矛盾によってその存在を単に証明するのではなく、実際に解決策を示さなければならないことを意味します。詳細については、数学の直観主義論理構成主義を参照してください。

これはもちろん非常に制限的な定義であり、私が興味深いアルゴリズムと呼んでいるものだけを考慮しています。そのため、ほとんどすべてが無視されます。ただし、アルゴリズムに関するすべての教科書も同様です。彼らは面白いもののいくつかだけを教えようとします。

問題のすべてのパラメーター(入力データ)を指定すると、指定された結果を段階的に取得する方法がわかります。典型的な例は、方程式の解決です(名前アルゴリズムは、実際には、いくつかの方程式の解決を研究したペルシャの数学者MuḥammadibnMūsāal-Khwārizmīの名前から派生しています)。証明の一部は、アルゴリズムで計算された一部の値に何らかのプロパティがあることを確認するために使用されますが、これらの部分をアルゴリズム自体に保持する必要はありません。

もちろん、これは形式化された論理フレームワーク内で実行する必要があります。形式化された論理フレームワークでは、データの計算対象、許可される基本的な計算ステップ、使用される公理が確立されます。

あなたの階乗の例に戻ると、それは些細なものではありますが、アルゴリズムとして解釈されるかもしれません。通常の階乗関数は、算術フレームワークが与えられ、整数nが与えられると、最初のn個の整数の積である数が存在するという証明に対応します。階乗計算と同様、これは非常に簡単です。他の機能ではより複雑になる可能性があります。

ここで、可能であればすべての整数に当てはまるとは限らないが(値の有限領域に当てはまる可能性がある)階乗を表にすることにした場合、あなたがしていることはaで定義することによって階乗の存在を公理に含めること各公理の新しい公理の値。これにより、何も証明する必要がなくなります(計算する必要がなくなります)。

しかし、公理系は有限(または少なくとも有限に定義された)であると想定されています。また、階乗の値は整数ごとに無限大です。したがって、無限関数を公理化する場合、つまり無限領域で定義される場合、公理の有限系で問題が発生します。これは、すべての整数に対してテーブルルックアップを実装できないという事実に基づいて計算上変換されます。これは、アルゴリズムの通常の有限性要件を無効にします(しかし、しばしば提示されるのと同じくらい厳密になるのですか?)。

すべてのケースを処理するために、有限に定義された公理ジェネレータを使用することを決定できます。これは、多かれ少なかれ、必要に応じて配列を初期化するための標準的な階乗プログラムをアルゴリズムに含めることになります。それはプログラマーによるメモ化と呼ばれます。これは実際には、事前に計算されたテーブルに相当するものに最も近いものです。テーブルが実際に遅延評価モードで必要に応じて作成されるという事実を除いて、事前に計算されたテーブルがあることを理解できます。この議論には、もう少し正式な注意が必要でしょう。

複雑な操作やパフォーマンス分析を行うために、必要に応じてプリミティブ形式の操作を定義し(正式なシステムとの一貫性を保ちながら)、アルゴリズムで使用するときに選択したコストを割り当てることができます。ただし、アルゴリズムを実際に実装する具体的なシステム(コンピューター、または脳など)がこれらのコスト仕様を尊重できない場合、分析は知的に興味深いかもしれませんが、現実の世界で実際に使用する価値はありません。

21000

どんなプログラムが面白いか

この議論は、プログラムと証明の間のカリー-ハワード同型などの結果により適切にリンクされるべき です。プログラムが実際に何かの証拠である場合、プログラムは上記の定義の意味で興味深いプログラムと解釈される可能性があります。

しかし、私の(限られた)理解のために、この同型は、型が公理理論の命題に対応する適切な型付けシステムで型付けできるプログラムに限定されています。したがって、すべてのプログラムが興味深いプログラムとして認められるわけではありません。私の推測では、その意味でアルゴリズムが問題を解決することになっているということです。

これはおそらく、ほとんどの「ランダムに生成された」プログラムを除外します。

また、「興味深いアルゴリズム」とは何かのややオープンな定義です。おもしろいとみなすことができるプログラムは間違いなくそうです。しかし、これまで型付けできなかったプログラムは、より高度な型システムで型付け可能になる可能性があるため、興味深いものになります。より正確には、それは常に興味深いものでしたが、適切な型システムの知識がないため、それを知ることができませんでした。

しかし、そのような実装のようないくつかのラムダ式、ことが知られているので、必ずしもすべてのプログラムが、typeableあることが知られているYコンビネータは音型システムに入力することができません

このビューは、公理的証明システムに直接関連付けることができるプログラミング形式にのみ適用されます。チューリングマシンなどの低レベルの計算形式にどのように拡張できるかわかりません。ただし、アルゴリズムと計算可能性は問題と解決策のエンコードのゲームであることが多いため(ラムダ計算でエンコードされた算術のことを考えてください)、アルゴリズムのエンコードであると示される形式的に定義された計算もアルゴリズムであると考えることができます。このようなエンコーディングでは、Turing Machinesなどの低レベル形式で表現できるもののごく一部のみを使用する可能性があります。

このアプローチの関心の1つは、計算ドメインの「物理的表現可能性」の実際のエンコードの問題からより抽象的で独立したアルゴリズムの概念を提供することです。そのため、たとえば、計算上適切な使用方法がある限り、無限のオブジェクトを持つドメインを考慮することができます。


2
これは根本的な問題ではありますが、問題を簡単に理解することはできません。私はとんでもなく単純化する必要があり、間違いを犯したかもしれません。しかし、あなたが投票する場合は、その理由を教えてください。
babou 14年

ええ、私はダウン票に何があるのか​​分かりません。
仮名14年

@Pseudonym私の場合。私は知っていると思います。意味論者とアルゴリズム学者、特に計算可能性に取り組んでいる者との間の古い戦いであると思われます。それが、哲学とビジネスの間の戦いであり、それが何であり、何がかかるのかです。「意味のある」アルゴリズムに興味があります。それに応じて修正しました(しかし、私は知識の端にいますが、ほとんどの場合よりも優れているようです)。あなたは同じゲットーに苦しむかもしれません。- - - しかしながら。この微妙なトピックについては、意見が半セントに値する人はだれでも、適切な説明なしにダウン投票を夢見ることはないでしょう。
babou 14年

質問と回答の両方を読んだ後、実際の質問に十分に焦点を合わせておらず、未完成の考えが多すぎるため、私はそれを支持するつもりです。さらに、アルゴリズムの定義で「問題の解決」が欠けているとは思わない。しかし、アルゴリズムを構成するものの定義において「セマンティクス」を無視すべきではないことに同意します。
トーマスクリンペル14年

@ThomasKlimpel私が言ったように、私は本当の問題について十分な専門家ではありません。そして、私は他の答えはないと付け加えました。アルゴリズムを作成することは、アルゴリズムを理解することと同じではありません。隠すことは非科学的だろうという私の限られた知識に対する私の認識は、この未完の思考感情の源です。問題を無視するよりも、問題の存在を強調する方が良いようです。質問はセマンティックな質問( "What is ...?")であるため、アルゴリズムの例よりもセマンティクスのpovから各例を取り上げました。他の答えが正式な理解をもたらすと思いますか?私のコメントCF
babou

0

執筆時点では、「アルゴリズム」の正式な定義はありません。しかし、それに取り組んでいる賢い人々がいます。

私たちが知っていることは、「アルゴリズム」が何であれ、「数学関数」と「コンピュータープログラム」の間のどこかにあるということです。

数学関数は、入力から出力へのマッピングの正式な概念です。したがって、たとえば、「ソート」は、順序付け可能なアイテムのシーケンスと同じタイプの順序付け可能なアイテムのシーケンスとの間のマッピングであり、各シーケンスをその順序付けられたシーケンスにマッピングします。この関数は、異なるアルゴリズム(マージソート、ヒープソートなど)を使用して実装できます。同様に、各アルゴリズムは異なるプログラムを使用して実装できます(同じプログラミング言語が与えられていても)。

したがって、「アルゴリズム」とは何かについての最良のハンドルは、それがプログラム上のある種の等価クラスであり、2つのプログラムが「本質的に同じこと」をする場合に等価であることです。同じアルゴリズムを実装する2つのプログラムは同じ関数を計算する必要がありますが、その逆は成り立ちません。

同様に、アルゴリズム間に同等クラスがあり、2つのアルゴリズムが同じ数学関数を計算する場合は同等です。

このすべての困難な部分は、「本質的に同じもの」が意味するものを把握しようとすることです。

含めるべき明らかなことがいくつかあります。たとえば、2つのプログラムは、変数の名前の変更のみが異なる場合、本質的に同じです。プログラミング言語のほとんどのモデルにはネイティブな「同等性」の概念(たとえば、ラムダ計算におけるベータ削減とイータ変換)があるため、それらもスローする必要があります。

どの等価関係を選択しても、これにより何らかの構造が得られます。アルゴリズムは、プログラムの商カテゴリであるという事実により、カテゴリを形成します。いくつかの興味深い同等の関係は、興味深いカテゴリ構造を生じさせることが知られています。たとえば、原始再帰アルゴリズムのカテゴリは、カテゴリのカテゴリ内の普遍的なオブジェクトです。そのような興味深い構造を見たときはいつでも、この問い合わせの行がおそらく役立つことを知っています。


1
アルゴリズムの良い正式な定義がないと言ってもいいとは思いません。これは約100年前のケースでした。
十宝

1
@Juho Pseudonymはそれを強すぎるように聞こえるかもしれませんが、特に状況が進展していることを付け加えて、声明を緩和しようとしています。しかし、私は彼が評価においてかなり正しいと思います。私はこれに多くの時間を費やし、ほとんど同じように感じるので、私は遅く反応しています。人々は彼らの理解をかなり改善しましたが、全体の議論は本当のコンセンサスがないことを示しています...そして、私は関与する人々のレベルを考えると、ほとんどの貢献が非常に未熟であることがわかりました。彼が不公平な場合、誰が良い正式な定義を与えたと思いますか?
babou

あなたは100%正しいです。そして、チューリングが生きているか、複雑性理論の他の理論家であれば、彼はあなたに100%同意すると思います。学者は彼らの隠語を放棄する必要があります。実際に現場を妨げています。これは、彼らが死ぬと、最終的にはどんな形でも起こります。よろしくお願いします。
BananaCats著者

-4

あなたの質問と説明はそれほど関連していません。アルゴリズムは理論的なものであり、プログラミング言語には関係ありません。アルゴリズムは、問題を解決するための一連のルールまたはステップ(手順)です。問題は多くの方法または多くのアルゴリズムで解決できます。

2番目の解決策は、最初に多くの時間を要する要因の大きな配列を最初に計算し、それを保存することを意味します。より多くのストレージを消費しますが、最終的には高速になりますが、最初のストレージはストレージを消費せず、コンピューティングパワーを消費するため、環境に応じて選択する必要があります。


ええ、まったく関係はありません。画期的なもの。
BananaCats著者
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.