コンピュータプログラムとアルゴリズム


8

プログラムにはアルゴリズムが含まれていると言われていますが、その定義を参照すると、アルゴリズムは特定のタスクを実行するために記述された一連の命令であり、コンピュータープログラムはコンピューターで(一部の)タスクを実行するための一連の命令でもあります。

では、プログラムとアルゴリズムの違いは何ですか?これも一種のアルゴリズムですか?

実際、私はアルゴリズムとコンピュータープログラムの正式な定義を探しているので、それらを互いに区別したり、プログラム内でアルゴリズムを識別したりできます。

更新:私はウィキペディアで非公式な定義(少なくとも構文的には)によってプログラムがアルゴリズムであることに気付きました。

非公式の定義は、「一連の操作を正確に定義する一連のルール」とすることができます。これには数値計算を実行しないプログラムを含むすべてのコンピュータプログラム含まれます。一般に、プログラムは最終的に停止する場合のアルゴリズムにすぎません。

回答:


11

前回この質問が出たときと同じ答えを出すつもりです。

まず、執筆時点では「アルゴリズム」の正式な定義はないことを理解してください。ここでのキーワードは「フォーマル」です。

しかし、それに取り組む賢い人々がいます。

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

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

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

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

これらすべての困難な部分は、「本質的に同じこと」によって私たちが意味することを捉えようとすることです。

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

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


正確な回答をありがとうございます。別の質問です。プログラムを検討すると、それが何をするかに関係なく、それらはまだいくつかの入力を受け取り、いくつかの指示に従い、実行時にいくつかの結果を提供します。それらは(私たちが呼ぶように)問題を解決しないかもしれませんが、それはまだマッピングです。彼らは既知のアルゴリズムである可能性があります、私は何かプログラムを意味しますか?
アフマド

1
私があなたを正しく読んでいるのなら、「アルゴリズム」の正式な定義が「有用」でなければならないという条件を満たすべきかどうかを尋ねているのです。その概念を形式化することが不可能だからといって、私は「いいえ」と言います。
仮名2015

ごめんなさい!私の英語は上手ではありません、それであなたは何を「いいえ」と言いますか?プログラムの有用性を形式化することは不可能であり、定義により、プログラムはアルゴリズムであると認めますか?または、アルゴリズムのほかに有用性を考慮する必要があるとおっしゃっていますか?
2015

1
「有用な」を正式に定義することはできないため、「アルゴリズム」の正式な定義が有用であることを要求するべきではないと私は思います。
仮名2015

あなたの答えはこのスレッド+1で最も役に立ちます。私は「本質的に同じもの」とは、「意味的に同等」を意味すると信じています。また、すべてのプログラムは(OPが言うように)本質的にアルゴリズムであると思います。なぜなら、すべてのプログラムは、ある入力をある出力にマップする実装であるからです。あなたが述べたように、それはすべて視点に依存します。
doubleOrt 2018年

7

結局のところ、違いは視点の1つです。プログラムはプログラムです。プログラミング言語やマシンレベルの命令など、ある言語での一連のステートメントです。アルゴリズムは通常、機械語命令またはプログラミング言語ステートメントよりも高いレベルで記述されますが、レベルがどれだけ高いかはかなり柔軟です。たとえば、状況によっては、「配列を並べ替えてから、kth要素」は、 k配列内で最大のオブジェクト。他の状況では、ソートがどのように行われるかについてより詳細を指定したい場合があります。

あなたが言うように、アルゴリズムは「計算やその他の問題解決の操作、特にコンピュータが従うべきプロセスまたは一連のルール」のようなものです。つまり、文字通り、すべてのプログラムアルゴリズムです。ただし、通常は、アルゴリズムを実装するプログラムについて話します。通常、アルゴリズムを説明する場合、有能なプログラマーが選択した言語でアルゴリズムを実装できると想定して、実装方法の正確な低レベルの詳細は避けます。


アルゴリズムの正確さは数学の概念、ラムダ計算やチューリングマシンに関連していると思いますが、それでもその抽象化言語が何であるかわかりませんか?数学またはあいまいなステートメントが多い自然言語
Ahmad

8
@Ahmad Algorithmは非公式な概念です。正式な定義はありません。ある意味では、それは数学的な証明のようなものであり、正式な証明システムにおける正式な証明とは異なります。任意のアルゴリズムが任意の(チューリング完全)プログラミング言語で完全に実装できるのと同じように、非公式証明は、選択された(十分に強力な)公式証明システムで公式証明に「具体化」できると考えています。
Yuval Filmus

5

チューリング完全な考え方のアルゴリズムは、通常、入力と出力によって指定されます。実際のプログラムはより多くのことを行います。彼ら

  • ユーザーと通信し、
  • 他のマシンと通信し、
  • 環境に反応し、
  • 終了せず、引き続き有用です。

もっと。これらは通常、アルゴリズムや計算理論では考慮されていませんが、ほとんどのプログラムに不可欠です。


これは非常に良い点です。しかし、「通常は入力を出力にマップする手段として指定される」のような意味ですか?入力と出力を指定するだけでは十分ではありません。たとえば、mergesortとquicksortは、どの入力からも同じ出力を生成しますが、同じアルゴリズムとは見なされません。
David Richerby、2015

@DavidRicherby PLの意味での仕様について考えていました。他には何も指定しないので、アルゴリズムは他に何もしません。もちろん、具体的なアルゴリズムを説明するには、仕様以上のものを与える必要があります。
ラファエル

良い点ですが、結局のところ、プログラムがアルゴリズムであると認めた場合、あなたが取り組んだ問題がアルゴリズムについてどのように測定されているのかわかりません。たぶんAIトピック?!
2015

誰がそれを認めるのか、そしてその理由は?そして、ここでのメジャーとはどういう意味ですか?(そして私は確かにここにAIアングルを見ません。)
ラファエル

@Raphael私はそれを認めるかもしれません(構文を見ると、すべてのプログラムは類似しているように見えます。これらは命令のシーケンス、または入力から出力へのマッピングです)、プログラムの他の機能(対処したもの)がどのようにできるかわかりませんその定義から抽出されます。たとえば、クイックソートとMATLABまたはWindows Media Playerの違い!!
2015

2
  • アルゴリズムは、特定の問題を解決するための体系的なアプローチです。

  • プログラムは、コンピュータが従う一連の命令です。

したがって、プログラムは問題を解決する必要さえありません。私たちは皆、解決したよりも多くの問題を引き起こしたいくつかのプログラムについて考えることができると確信しています。プログラムは、多くのアルゴリズムの実装にすることができます。または、アルゴリズムは、多くのプログラムを一緒にパッチすることによって実装することができます。プログラムにアルゴリズムを含めることもできません。たとえば、単に終了する空のプログラム、またはおそらくHello Worldでさえ、アルゴリズムのないプログラムと考えることができます。

アルゴリズムは特定の問題を解決するため、特定の概念全体に焦点を当てています。したがって、アルゴリズムは、関連情報の1つのセットを別の派生情報のセットに処理するための抽象的なステップを提供します。プログラムでは、構成要素が概念的にまったく関連している必要はありません。たとえば、プログラムはイースターエッグを持つことができますが、適切にアルゴリズムと呼ばれるものはそうではありません。プログラムにはウイルスやトロイの木馬が潜んでいる可能性がありますが、アルゴリズムには潜んでいません。アルゴリズムがこれに到達できる最も近いのは、計画された欠陥がアルゴリズムによって確立された情報関係の一部である暗号化アルゴリズムのバックドアのようなものです。

そして最後に、プログラムはコンピュータープログラムの略で、トートロジー上コンピューターを必要とします。アルゴリズムにはありません。シャツ、ズボン、靴下を洗濯物から体系的に分離してから、それらを片付ける場合、これはアルゴリズムです。これは、関連する入力と出力を扱い、フローチャートで説明でき、効率の点で計算可能な結果を​​もたらします(たとえば、一致する靴下を見つけるために比較する必要のある衣類の数)。


2

アルゴリズムは概念またはアイデアです。問題を解決するための正式なアプローチです。アルゴリズムは、さまざまなプログラミング言語で表現または実装できます(通常、ほとんどすべての言語が任意のアルゴリズムを実装できます)。いくつかの例については、ウィキペディアのソートアルゴリズムを読む必要があります。

コンピュータプログラムは、特定のプログラミング言語での特定の命令シーケンスです。プログラムには、多くのアルゴリズムの実装が含まれている場合があります。Excelはプログラムですが、並べ替え機能はアルゴリズムの表れです。


1

アルゴリズムは、特定の問題または問題のクラスを解決するために実行される、自己完結型の段階的な操作のセットです。

コンピュータプログラムは、特定のプログラミング言語のルールに準拠する一連の命令であり、コンピュータで指定されたタスクを実行するように記述されています。

アルゴリズムは一般的であり、特定のプログラミング言語(実装)に変換する必要があります。


1
しかし問題の要点は、プログラム(そのソースコードまたはコンパイル済みバイナリのいずれか)「特定の問題または問題のクラスを解決するために実行される自己完結型の段階的な操作のセット」であるということです。
David Richerby、2015

しかし、そうではありません。プログラムはそれらの操作ではなく、それらの実装であり、特定のコンテキストでそれらを実行するものです。たとえば、Unix sortユーティリティは並べ替えアルゴリズムではなく、並べ替えアルゴリズムを使用します。
reinierpost 2017年

1

アルゴリズムは、特定の問題に対する私たちのアイデアや解決策を段階的に示しています。それは問題解決であり、人間が理解できるアプローチであり、コンピュータシステムではありません

プログラムは、コンピュータシステムによって問題を解決するために実装された段階的な指示です。プログラマだけでなくコンピュータも理解できる必要があります。


Computer Science Stack Exchangeへようこそ。まだ読んでいない場合は、cs.stackexchange.com / tour
バブー2015

1

ここでの他の答えは、重要なポイントを逃していると思います。私が教えた「アルゴリズム」の定義には、手順がすべての入力で停止するという要件が含まれていました。当然、すべての入力で停止するプログラムもそうでないプログラムもあるので、「プログラム」は「アルゴリズム」よりも広い手順のクラスになります。


これは普遍的ではありません。私が教えた定義にはその要件は含まれていませんでした。
reinierpost 2017年

1

次に、アルゴリズムとプログラムの間に線を引く方法をいくつか示します。

意味のある目的

プログラムは目的を持って書かれており、目標を達成するための試みを表しています。アルゴリズムは、その目標を達成するためのツールと見なすことができます。

たとえば、ドライバーはネジの状態を変更するアルゴリズムですが、ドライバー自体はそれを行う目的を持っていません。目的は、棚を置くようにプログラムを握るドライバーオペレーターの頭にあります。

ビジネスの論理

この点は、プログラムの目的に強く関係しています。プログラムには目的があるため、特定の日付、測定値、テクノロジー、名前などのように、必然的に現実世界の一部が含まれます。

一方、アルゴリズムにはビジネスロジックも実際のビットも含まれず、特定の値を操作する代わりに変数を操作します。

たとえば、この意味で、f(x) = x^2抽象的で変数に作用するような数学関数を、正確な値(少なくとも1つは参照用)を含む調理レシピと比較できます。

結果

この点は、プログラムのビジネスロジックに強く関連しています。エージェント(Webブラウザーのユーザーなど)は、アルゴリズムの結果ではなくプログラムの結果を使用します。

例えば、調理レシピの消費者は、ホイップクリームや加熱オーブンの結果ではなく、ケーキを消費します。


おそらく、ドライバーにはネジを回す意図がないと言った方がいいでしょうか?日常の英語では、確かにドライバーにねじを回す目的があると言えます。ねじを回すことは、ねじを回すことがまさにその目的で行われたことです。
David Richerby 2017年

また、「ビジネスロジック」(多くのプログラムはビジネスとは何の関係もない)、またはアルゴリズムに「ビジネスロジックも実世界のビットも含まれていない」とはどういう意味かわかりません。たとえば、頂点やエッジではなく、町や道路に関して、最短経路アルゴリズムを完全にうまく表現できます。アルゴリズムは「現実世界のビットを含む」ではないでしょうか?
David Richerby 2017年

@DavidRicherby、あなたは正しい、私の言い回しがあいまいです。私が意味したのは、意味のある目的です。ねじを回してねじを回すことは、使用されない配列をソートすることと同様に無意味です。ビジネスロジックとは、ユーティリティロジックとテクノロジースタックのボイラープレートを除くすべてのプログラムロジックを意味します。つまり、プログラムの目的を実際に実装するすべてのロジック、つまりケーキを焼くビジネスロジックは、材料を混合して焼くことであり、混合または焼くことの学習は含まれません(この場合、再利用されたユーティリティロジックです)。
Robert Mugattarov 2017年

@DavidRicherby、現実世界のビットについては、具体化を意味します。つまり、アルゴリズムとは異なり、プログラムは何らかの形で物理的な世界と通信する必要があります。一方、アルゴリズムは純粋に数学的概念である場合があります。
Robert Mugattarov 2017年

1

他の回答がリードするのに十分であると確信していますが、ここに私がアルゴリズムとプログラムの違いを見る方法があります

  • アルゴリズムは、問題を解決するために何らかの順序で従う必要がある単純なステップ(マシンに依存しない)で構成されます。

  • プログラムは、特定のタイプのマシンがアルゴリズムを実践するための命令セットです

例えば。

他のステップを実行する前に特定の場所に到達するためのステップがあるアルゴリズムがあるとします。この到達ステップがどのように実行されるかは正確には定義されていません。それは、それをどのように実装するかによって異なります(プログラムです)。

アルゴリズムはプログラムの抽象化であると言えます。つまり、正確な詳細はありませんが、何かをするための計画を立てています。

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