algorithm
「algorithm」とは・「algorithm」の意味
「algorithm」とは、問題を解決するための手順や計算方法を指す言葉である。コンピューターサイエンスや数学の分野でよく使われ、特にプログラミングにおいては、効率的なアルゴリズムが重要視される。アルゴリズムは、入力データを受け取り、一連の手順に従って処理を行い、最終的には出力データを生成する。「algorithm」の発音・読み方
「algorithm」の発音は、IPA表記では /ˈælɡəˌrɪðəm/ であり、カタカナ表記では「アルゴリズム」となる。日本人が発音するカタカナ英語では「アルゴリズム」と読む。「algorithm」の定義を英語で解説
An algorithm is a step-by-step procedure or set of instructions for solving a problem or accomplishing a task, especially in the fields of mathematics and computer science. Algorithms are often used in programming to process input data and generate output data in an efficient and accurate manner.「algorithm」の類語
「algorithm」の類語には、以下のような言葉がある。Procedure
「procedure」は、特定の目的を達成するための一連の手順や操作を指す。アルゴリズムと似ているが、より一般的な用途に使用される。Method
「method」は、問題を解決するための手法やアプローチを指す。アルゴリズムと同様に、手順や計算方法を示すことがある。「algorithm」に関連する用語・表現
Sorting algorithm
「sorting algorithm」は、データを特定の順序で並べ替えるためのアルゴリズムを指す。例えば、バブルソートやクイックソートなどがある。Search algorithm
「search algorithm」は、データ構造から特定の要素を見つけ出すためのアルゴリズムを指す。例えば、線形探索や二分探索などがある。「algorithm」の例文
1. The algorithm processes the input data and generates the output data.(アルゴリズムは入力データを処理し、出力データを生成する。) 2. He developed a new algorithm for solving the problem.(彼はその問題を解決するための新しいアルゴリズムを開発した。) 3. The efficiency of an algorithm is an important factor in programming.(アルゴリズムの効率はプログラミングにおいて重要な要素である。) 4. The sorting algorithm arranged the data in ascending order.(ソートアルゴリズムはデータを昇順に並べ替えた。) 5. The search algorithm found the target element in the data structure.(探索アルゴリズムはデータ構造から目的の要素を見つけ出した。) 6. The algorithm's complexity affects its performance.(アルゴリズムの複雑さはその性能に影響する。) 7. The programmer optimized the algorithm to reduce processing time.(プログラマーは処理時間を短縮するためにアルゴリズムを最適化した。) 8. The algorithm was tested on various data sets to ensure its accuracy.(アルゴリズムの正確性を確認するために、さまざまなデータセットでテストが行われた。) 9. The algorithm is designed to handle large amounts of data efficiently.(アルゴリズムは大量のデータを効率的に処理するように設計されている。) 10. The algorithm is based on a mathematical model.(アルゴリズムは数学的モデルに基づいている。)アルゴリズム【algorithm】
アルゴリズム
【英】:algorithm
概要
その実行が必ず有限ステップで停止する有限個の機械的操作の列のこと. ここで, 機械的操作とは, 計算機の基本命令と考えて良い. ORにおいては, 定式化した問題に対し具体的に解を求めて現実に適用する必要があるので, 問題の解を得る効率の良いアルゴリズムを求めることは非常に重要である. アルゴリズムの代表的な設計法としては, 貪欲法(greedy), 2分探索, 動的計画, 分割統治等がある.
詳説
アルゴリズム (algorithm) とは, その実行が必ず有限ステップで停止する有限個の機械的操作の列のことであり, 算法とも訳される.ここで, 機械的操作とは, 計算機の基本命令の列と考えて良い. この名称は, 9世紀のアラビアの代数学者, フワーリズミー (al-Khwarizmi) に由来する.数学の研究においては, 問題に対して解を構成する手順を求める接近法と, 解の存在を証明する接近法とが典型的であるが, 前者の, 解を求める手順のうち有限ステップで停止するものがアルゴリズムである. ユークリッド(Euclid) の互除法, 定規とコンパスによる作図, 高次方程式の解法等, 古くよりアルゴリズムを求める研究がなされてきた. その中で, アルゴリズムの概念を厳密に定義する必要性が, 1900年に提唱されたヒルベルト(D. Hilbert) の第10問題, すなわち, 不定不等式の有理整数解の存在を判定するアルゴリズムを求める問題以来, 次第に明確に意識されるようになり, 1930年代に至ってチューリング (A. M. Turing), チャーチ (A. Church), クリーネ (S. C. Kleene) によってそれぞれ異なった計算モデルを用いてアルゴリズムの厳密な定義がなされた. それらは, 等価であることが知られている. 特に, チューリングによりそれを解くアルゴリズムが存在しない問題があること (チューリング機械の停止問題, halting problem for Turing machines) が示されたことの意義は大きい.
アルゴリズムの設計法は, 1940年代の電子計算機の出現とともに精力的に研究されてきた. 巡回セールスマン問題 (traveling salesman problem) 等, 原理的に有限ステップでは解けるが, 現実的な時間で解くアルゴリズムを作るのが困難な問題があることが知られるにつれ, 次第に計算の複雑さ (computational complexity) への認識が高まってきた. 一般に, 実行時間が入力サイズの多項式時間 (polynomial time) 以下のアルゴリズムを効率の良いアルゴリズムという. 1971年にクック (S. A. Cook) によりNP困難性 (NP-hardness, 計算の複雑さ参照) の概念が導入され, それ以来, カープ (R. Karp) を始め多くの研究者によって, 巡回セールスマン問題等, 組合せ最適化問題 (combinatorial optimizationproblem) を含む幾多の問題がNP困難であることが証明されてきた. あるNP困難な問題に対する多項式時間のアルゴリズムがあれば, 従来多項式時間のアルゴリズムを作るのが困難と思われてきた多くの問題に対しても多項式時間アルゴリズムが構成できる.しかしながら, それはほとんどありえないことから, NP困難な問題に対して多項式時間アルゴリズムは存在しないと信じられている.
与えられた問題に対して効率の良いアルゴリズムを開発するには,
が必要である.
代表的なアルゴリズム設計技法としては以下のものが知られている.
例: 最小木問題 (minimum spanning tree) に対するクラスカル (J. B. Kruskal Jr.) のアルゴリズム, その他, 近似アルゴリズム (approximation algorithm) としても良く用いられる.
- ・2分探索 (binary search): 予めソートされた列中で, ある要素を探す. 中央の要素と比較し, それよりも大きいか, 小さいかを調べ, ソート列中のどちら側にあるかを知る. 一回の反復毎に要素数が半分以下になるので, (ソート列中の要素数) 回の比較で求まる.
- ・分割統治(divide and conquer): 解くべき問題を小規模な部分問題に分割して解き, 部分問題の解を統合することで全体の解を得ようとする方法. これは, 逐次のみならず並列アルゴリズムの設計においても基本的方法である.
- ・動的計画 (dynamic programming):「最適方策(optimal policy) は, それまでの決定がどのようであろうとも, それ以降も最適な決定を下さなければならない. (R. Bellman)」という, 最適性の原理 (principles of optimality) に基づく. アルゴリズム的観点から見ると, 一度計算した結果を記憶しておくことで冗長な再計算を避ける方法である. 最短路問題 (shortest path problem) に対する各種アルゴリズム等, グラフ・ネットワーク問題 (graph and network problems), および, 組合せ最適化問題において多くの応用例がある.
問題が良い構造をもつと効率の良いアルゴリズムを設計することが可能となる. 特に, 貪欲アルゴリズムがうまく適用できる問題の構造については, マトロイド (matroid) の項目を, その他, グラフ・ネットワークの構造を持つ問題で効率の良いアルゴリズムが存在するものについては, グラフ・ネットワーク, グラフの連結度 (connectivity), ネットワークフロー問題 (network flow problem), マッチング問題 (matching problems) 等の項目を, また, 組合せ最適化問題について, その他, 劣モジュラ最適化 (submodular optimization), 離散凸解析 (discrete convexanalysis) 等の項目を参照されたい. また, データ構造 (data structure) を工夫することで効率の良いアルゴリズムを設計できる場合が多い.
なお, アルゴリズムの実行時にデータが次々に入力され, 実行前には入力されるデータが未知であるアルゴリズムをオンラインアルゴリズム (online algorithm) という. オンラインアルゴリズムのいくつかの例が [1] にある. また, これまでは, 逐次かつ決定的アルゴリズムを論じてきたが, 実行に確率的動作を導入した確率アルゴリズム (probabilistic algorithm, または, ramdomized algorithm), 複数のプロセッサ上での並列アルゴリズム (parallel algorithm), および, 分散環境下での複数の計算機間に跨る計算に関する分散アルゴリズム (distributed algorithm) については, それぞれの用語解説, 及び, 並列アルゴリズムについては, [5, 9, 15, 16] を, 分散アルゴリズムについては, [10, 14, 19] を参照されたい. 文献[3] は, 連立1次方程式の解法, 逆行列の計算から始め, 非線形最適化 (nonlinear optimization), ネットワーク最適化 (networkoptimization) 等に関連した多様な並列, ないし, 分散アルゴリズムを扱っており, OR関係者にとって便利である. なお, 紙数の関係で本中項目では離散的対象に関する厳密に解を求めるアルゴリズムに話題を限ったが, 線形計画 (linear programming), 非線形計画 (nonlinear programming) 等, 各種数理計画に関するアルゴリズムについては, それぞれ該当する項目を参照されたい. また, NP困難な問題に対して良い実行可能解 (feasible solution) を現実的に求める近似アルゴリズムやその枠組であるメタヒューリスティックス (metaheurisitics) についても, それぞれ該当する項目を参照されたい.
[1] A. V. Aho, J. E. Hopcroft and J. D. Ullman, The Design and Analysis of Computer Algorithms, Addison-Wesley, 1974; 野崎昭弘, 野下浩平共訳,『アルゴリズムの設計と解析I, II』, サイエンス社, 1977.
[2] 浅野孝夫, 今井浩, 『計算とアルゴリズム-計算機の科学-』, オーム社, 1986.
[3] D. P. Bertsekas, J. Tsitsiklis, Parallel and Distributed Computation, Prentice-Hall, 1989.
[4] T. H. Cormen, C. E. Leiserson, R. L. Rivest, Introduction to Algorithms, MIT Press, 1990; 浅野哲夫, 岩野和生, 梅尾博司, 山下雅史, 和田幸一訳,『アルゴリズムイントロダクション』, 第1-3巻, 近代科学社, 1995.
[5] A. Gibbons, W. Rytter, Efficient Parallel Algorithms, Cambridge University Press, 1988.
[6] 平田富夫,『アルゴリズムとデータ構造』, 森北出版, 1990.
[7] 茨木俊秀,『アルゴリズムとデータ構造』, 昭晃堂, 1989.
[8] 石畑清,『アルゴリズムとデータ構造』, 岩波書店, 1989.
[9] J. Jáá, An Introduction to Parallel Algorithms, Addison-Wesley, 1992.
[10] 亀田恒彦, 山下雅史,『分散アルゴリズム』, 近代科学社, 1994.
[11] D. E. Knuth, The Art of Computer Programming, Vol.I, Addison-Wesley, 1973; 広瀬健訳,『基本算法 / 基礎概念』, サイエンス社, 1978, および, 米田信夫, 筧捷彦訳, 『基本算法 / 情報構造』, サイエンス社, 1978.
[12] D. E. Knuth, The Art of Computer Programming, Vol.II, Addison-Wesley, 1981; 渋谷正昭訳,『準数値算法 / 乱数』, サイエンス社, 1981, および, 中川圭介訳, 『準数値算法 / 算術演算』, サイエンス社, 1986.
[13] Jan van Leeuwen ed., Handbook of Theoretical Computer Science Vol.A: Algorithms and Complexity, Elsevier Science B. V., 1990; 廣瀬健, 野崎昭弘, 小林孝次郎監訳,『コンピュータ基礎理論ハンドブックI, アルゴリズムと複雑さ』, 丸善, 1994.
[14] N. A. Lynch, Distributed Algorithms, Morgan Kaufmann, 1996.
[15] 宮野悟,『並列アルゴリズム』, 近代科学社, 1993.
[16] F. P. Preparata著, 上林弥彦, 岡部寿男, 浜口清治, 武永康彦編・訳,『プレパラータ先生の超並列計算講義』, 共立出版, 1996.
[17] R. Sedwick, Algorithms, 2nd ed., Addison-Wesley, 1988; 野下浩平, 星守, 佐藤創, 田口東共訳,『アルゴリズム第1巻=基礎・整列』, 近代科学社, 1990,『アルゴリズム第2巻=探索・文字列・計算幾何』, 近代科学社, 1992, および,『アルゴリズム第3巻=グラフ・数理・トピックス』, 近代科学社, 1993.
[18] 島内剛一, 有澤誠, 野下浩平, 浜田穂積, 伏見正則編,『アルゴリズム辞典』, 共立出版, 1994.
[19] G. Tel, Introduction to Distributed Algorithms, Cambridge University Press, 1994.
組合せ最適化: | AVL木 NP困難 TDI性 アルゴリズム オンラインアルゴリズム クラスMAX SNP クラスNC |
アルゴリズム
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/11/29 21:40 UTC 版)
アルゴリズム(英: algorithm[注 1])とは、解が定まっている「計算可能」問題に対して、その解を正しく求める手続きをさす[注 2]。算法[1][2]、計算手順[3][4]、処理手順とも和訳される[5]。
実用上は、アルゴリズムの実行に要する記憶領域の大きさや完了までに要する時間(空間計算量と時間計算量)が小さいこと、特に問題の規模を大きくした際に必要な記憶領域や計算量が急激に大きくならないことが重要となる。
アルゴリズムの実行は形態によらない。たとえばアルゴリズムはコンピュータ上にコンピュータプログラムとして実装して実行できる。
概要
岩波国語辞典「算法」に、まず「計算の方法」とした後に2番目の詳細な語義でalgorithmの訳として、
特に、同類の問題一般に対し、有限回の基本的操作を、指示の順を追って実行すれば、解がある場合にはその解が得られ、解がない場合にはそのことが確かめられるように、はっきりと仕組んである手順。
とある。一見では国語辞典らしい平易な日本語で書かれた説明だが、例えば解が無いと無限ループに陥るといったようなものは除外されるし、「アルゴリズムの視覚的表現」としてよく使われるフローチャートのようなもので書いてあっても、基本的操作がはっきりと書いてなければそれはアルゴリズムではない、というわけである。これは、#形式化の節で述べるような、理論計算機科学での「アルゴリズム」の扱いに沿っている。
歴史
記録に残る最古のアルゴリズムは、エウクレイデスの原論のものである。その中でも、二つの整数の最大公約数を求めるユークリッドの互除法[6]は、典型的なアルゴリズムとして知られている。
「アルゴリズム」という名称は、現在のイラクのバグダードにおける9世紀の数学者アル=フワーリズミー[注 3]の名前から来ているといわれている。彼がインド数学を紹介した著作『インドの数の計算法』(825年)が、12世紀にチェスターのロバート(あるいはバースのアデラード)によってラテン語に翻訳され、『algoritmi de numero Indorum アルゴリトミ・デ・ヌーメロ・インドルム』[7](直訳すると「インドの数におけるアルゴリトミ」)という題で、以後500年間にわたってヨーロッパ各国の大学で数学の主要な教科書として用いられた。この書は、冒頭に「algoritmi dicti(アル・フワリズミーに曰く)」という一節があるので『
1920〜30年代、計算可能性のための数学モデル(計算モデル)がいくつも提案された(チューリングマシン、帰納的関数、ラムダ計算など)。後にこれらの定義はすべて同等であることがわかり、それらにより同値な概念を「計算可能」とすることが提案された(チャーチ=チューリングのテーゼ、提案者はスティーヴン・コール・クリーネ。なお、チューリングのほうを先とする専門家もいる)。したがって、現在では「これらによって『計算可能なもの』を計算する手続き」をアルゴリズムと呼ぶ。
形式化
ここではまず非形式的にアルゴリズムについて述べた後で、停止性など形式的(フォーマル)な議論を続ける。
アルゴリズムはコンピュータが情報を処理する基盤である。すなわち、プログラムは本質的にはアルゴリズムであり、コンピュータが特定のタスク(従業員の給与計算、学生の成績表の印刷など)を(指定された順序で)実行するためのステップをコンピュータに指示する。したがって、アルゴリズムはチューリング完全なシステムで実行可能な操作の並びとみなすこともできる。
…チューリングの命題についての非形式的な論証から、より強い命題が正当化される。すなわち、全てのアルゴリズムはチューリング機械でシミュレート可能である…Savage [1987] によれば、アルゴリズムはチューリング機械によって定義される計算過程である。[8]
アルゴリズムは情報処理と結びついていることが多く、データは何らかの入力源(機器)から読み込まれ、結果は何らかの出力先(機器)に書かれるか、次の処理の入力となるよう保持される。保持されたデータはアルゴリズムを実行する実体の内部状態の一部とみなされる。実際、コンピュータでは状態をデータ構造に保持したりする。
このような計算過程について、アルゴリズムは厳密に定義されなければならず、ありうる全ての状況に適用可能な形で指定される。すなわち、どのような条件のステップでも、ケースバイケースで体系的に扱わなければならず、各ケースの扱い方は明確で(計算可能で)なければならない。
アルゴリズムは明確なステップの明確なリストなので、その計算順序は最も重要である。命令列は、先頭から最後尾に向かって逐次的に実行されるよう記述される。この考え方をより形式的にしたものが制御構造である。
以上の説明は、命令型プログラミングを前提としてアルゴリズムを定式化する場合である。これは、最も典型的な概念であり、タスクを離散的かつ機械的なものとして表すものである。その場合に特有の操作として、変数に値を設定する「代入」がある。これは、直観的にはメモリをメモ帳のようなものとみなすところから生まれた。
これ以外のアルゴリズムの概念化として、関数型プログラミングや論理プログラミングがある。
アルゴリズムの記述
プログラマは擬似コードなどを使うことが多いが、理論計算機科学での形式的[注 4]で厳密[注 5]な議論には計算モデルを使う。もちろん相互に得失があり、必要であれば互いにどちらも使う。
停止性
アルゴリズムは最終的に必ず停止しなければならないとする定義もある。というより形式的で厳密な議論では停止するものだけがアルゴリズムである(チャーチ=チューリングのテーゼも参照)。
そのため、そうでないものと呼び分ける必要があることもあり、クリーネは停止性のあるアルゴリズムを「decision procedure for the question」「decision method for the question」「algorithm for the question」とした[9]。停止しない可能性のある手続きについては、クヌースは「computational method」[10]と呼び、クリーネは「calculation procedure」「algorithm」[9]と呼んでいる。
ミンスキーは、(特定の状態から開始された)アルゴリズムの停止性について次のように述べている。
しかしもし実行中のプロセスの長さが不明ならば、それを試すことは得策ではないかもしれない。何故なら、もしプロセスが永遠に続くなら、我々は答えを得られないかもしれないのだから。[11]
アラン・チューリングが停止性問題として提起したとおり、任意のプロシージャと初期状態が与えられたとき、それが停止するかどうかを判定するアルゴリズムは存在しない(この前半を「任意のアルゴリズムと初期状態が」としてはいけない。この記事の他の部分では完全に混用されているが、この文の後半の「アルゴリズムは」という表現は、必ず停止するもののみを指してそう言っているのだから。せめて1文の中では混用はまずい)。
不完全な(あるいは間違った)アルゴリズムは、次のいずれかの結果となる。
- 停止しない。
- 解の範囲を逸脱した値を返して停止する。
- 誤った解を返して停止する。
- 解を返さずに停止する。
- これらの組合せ。
クリーネはこれらをアルゴリズム内で検出してエラーメッセージを返すか、可能ならば無限ループに入らせることを提案した[9]。また、結果が真理値である場合についてクリーネは第三の論理記号「
簡単なアルゴリズムの例として、(整列されていない)有限長の数列(リスト)に含まれる(大きさが一定値以下の整数の)最大の数を見つけ出すアルゴリズムを考える。ここでは、リストに含まれる全ての数を調べる必要があるが、一度に調べらることができるのは1つだけであるとする。ここから得られるアルゴリズムを、日本語で記述すると次のようになる。
概念的記述
- 最初の要素(数)が最大と仮定する。
- 残りのリスト上の数を順に見ていき、最大の数よりも大きい数が見つかったら、それを新たな最大として記憶する。
- 最後に記憶した数がそのリストでの最大の数であり、これで処理が完了する。
次に、プログラミング言語的にやや形式的に記述すると、次のような擬似コードになる(「←」は代入を表し、「return」はその後に記された値を返してアルゴリズムが終了することを意味する)。
擬似形式的記述
入力: 空でない数リスト L、出力: リスト L 内の最大(largest)の数。
algorithm 最大値を求める is
largest ← L0
for each item ∈ リスト L≧1 do
if largest < item then
largest ← item
end
end
return largest
end
アルゴリズム解析
この節は検証可能な参考文献や出典が全く示されていないか、不十分です。(2021年7月) |
あるアルゴリズムの実行に必要な計算資源(時間や記憶領域)の量を見積もることは重要である。そのような量を定量的に求める分析法はアルゴリズム解析と呼ばれ、研究がなされてきた。例えば、上記のアルゴリズムの実行に必要な時間はリストの長さを
アルゴリズムには様々な分類方法があり、それぞれに利点がある。
実装による分類
アルゴリズム分類の1つの方法として、実装手段による分類がある。
- 再帰 / 反復
- 再帰アルゴリズムは、ある条件が成り立つまで自身を再帰的に呼び出すものであって、関数型言語でよく使われる。反復アルゴリズムは、ループのような反復構造と場合によってはスタックなどのデータ構造を補助的に使い、問題を解く。一部の問題は、どちらか一方の実装が自然である。例えば、ハノイの塔は再帰的実装の方が分かりやすい。再帰アルゴリズムは全て反復アルゴリズムでも実装可能であり、逆も同じである(ただし、複雑さは変化する)。
- 論理
- アルゴリズムは、制御された演繹であるとも言われる。これを アルゴリズム = 論理 + 制御 と表現することもある[13]。論理部分は計算で使われる公理を表し、制御部分は公理に演繹が適用される方法を決定する。これは論理プログラミングというパラダイムの基本である。純粋な論理プログラミングでは、制御部分が固定されていて、アルゴリズムは論理部分だけで指定される。この手法の魅力は、プログラム意味論的なエレガントさがある点である。公理の変化は定式化されたアルゴリズムの変更を伴う。
- 逐次 / 並列 / 分散
- アルゴリズムは通常、コンピュータが一度に1つのアルゴリズム内の1つの命令だけを実行するものと仮定して議論される。このようなコンピュータは、シリアル・コンピュータなどと呼ばれることもある。そういった環境向けに設計されたアルゴリズムは逐次アルゴリズムと呼ばれ、それとは対照的な分類として並列アルゴリズムや分散アルゴリズムがある。並列アルゴリズムは、複数のプロセッサが同時並行して同じ問題を解くのに使えるコンピュータアーキテクチャで有効である。また、分散アルゴリズムは、複数のマシンがコンピュータネットワークで相互接続された環境で使われる。並列/分散アルゴリズムは、問題を分割して解き、その結果を集めて最終的な結果を得る。その場合、個々のプロセッサの計算時間(実行命令数)だけでなく、プロセッサ間の通信オーバーヘッドも計算資源の消費量として問題になる。例えば、ソートアルゴリズムは効率的に並列化できるものもあるが、通信オーバーヘッドは高くつく(部分数列をソートした結果を集めるには、結局部分数列そのものをやりとりしなくてはならない)。反復アルゴリズムは一般に並列化可能である。並列アルゴリズムがない問題は、本質的に逐次的な問題である。
- 決定性 / 非決定性
- 決定性アルゴリズムでは解法の全ステップが常に正確に決定されるが、非決定性アルゴリズムはいわば推量や推測で問題を解くものであり、ヒューリスティクスを使ってより正確に推測する。
- 正解 / 近似解
- 一般にアルゴリズムは正解を得るものだが、近似アルゴリズムは近似解を求め、その近似性に一定の根拠があれば、これも広義のアルゴリズムとして含めて考えることができる。近似には、決定性の戦略もあれば、乱択の戦略もある。多くの難しい問題では、近似アルゴリズムしか実用的な解法が存在しない。近似アルゴリズムはその近似解の近似性能も評価・保証などがされる必要がある。
設計パラダイムによる分類
別の分類方法として、アルゴリズムの設計方法論やパラダイムで分類する方法がある。それぞれ異なるいくつかのパラダイムが存在する。さらに、個々のパラダイムの中にも様々な異なる形式のアルゴリズムが含まれている。以下に主なパラダイムを挙げる。
- 分割統治法
- 分割統治法は、問題を(通常再帰的に)複数または単一の同じ種類のもっと小さい問題に還元していき、最終的に容易に解ける程度の大きさにする。分割統治の例としてはマージソートがある。ソートは入力データを分割してそれぞれに対して行われ、統治フェーズではそれらの結果をマージする。分割統治法を単純化したものとして decrease and conquer algorithm がある。これは、問題を全く同じ複数の部分問題に分割し、その解をより大きな問題を解くのに利用する。分割統治法では一般に分割された個々の部分問題は全く同じではないため、統治フェーズは decrease and conquer algorithm よりも複雑になる。decrease and conquer algorithm の例として二分探索がある。
- 動的計画法
- 部分問題の最適解から全体の最適解が得られるような構造の問題や、同じ部分問題の最適解が様々な問題の解法に有効であるような問題の場合、動的計画法を使って既に計算済みの解を再計算するのを避けることができ、解法を効率化できる。例えば重み付けのあるグラフでの最短経路を求める場合、始点に隣接する全ての頂点について最短経路が分かっていれば、容易に最短経路が求められる。動的計画法とメモ化は密接な関係がある。分割統治法との違いは、分割統治法では部分問題は多少なりとも独立しているのに対して、動的計画法では部分問題が重複している。単純な再帰との違いは、再帰部分をキャッシュ化またはメモ化する点である。部分問題が互いに独立している場合、メモ化は何の役にも立たない。したがって、動的計画法はあらゆる複雑な問題の解法とはならない。動的計画法では、メモ化あるいは既に解かれた部分問題の表を使うことによって、指数関数的性質をもつ問題を多項式レベルの複雑性に削減することができる。
- 貪欲法
- 貪欲法は動的計画法に似ているが、部分問題の解を各段階では知る必要がないという点が異なる。その代わりに、各時点で最もよい選択と思われるものを選んでいく。貪欲法では、それまでの選択と現時点の局所最適解から最適と思われる解を構築していくのであって、考えられるあらゆる解を評価することはない。したがって網羅的ではなく、必ずしも正解にたどり着けるわけではない。しかし、性能は非常によい。貪欲法としてよく知られている例として、最短経路木を求めるクラスカル法、プリム法、ダイクストラ法などがある。
- 線型計画法
- 線型計画法で解ける問題では、制約条件として入力に関する線型の不等式があり、入力に関するある線型の関数を最大化(または最小化)する値の組合せを求めるものである。有向グラフに関する最大フロー問題など、多くの問題が線型計画問題として記述でき、シンプレックス法などの汎用アルゴリズムで解くことができる。線型計画法の解空間を整数に限定したものを整数計画法と呼ぶ。
- 還元
- この技法は、難しい問題をほぼ最適なアルゴリズムが既知の別の問題に変換するものである。例えば、ソートされていない数列から中央値を求める選択アルゴリズムとして、まずその数列をソートし、そこから真ん中に位置する値を取り出すという方式がある。
- 探索と数え上げ
- チェスの手を考えるなどといった問題は、グラフ問題としてモデル化できる。そのような問題では、比較的よく研究されているグラフ探索アルゴリズムを使うことができる。このカテゴリーには、探索アルゴリズム、分枝限定法、バックトラッキングも含まれる。
- 確率的パラダイムとヒューリスティクス
- ここに分類されるのは広義のアルゴリズム、ないし、遺伝的アルゴリズムのように(名前に反して)アルゴリズムではないものである。
- 乱択アルゴリズム - 選択を無作為(あるいは擬似無作為)的に行う。問題によっては、無作為性をもった解法が最も性能がよいと証明されているものもある。
- 遺伝的アルゴリズム - 生物の進化過程をまねた手法で解を求めるもの。無作為な突然変異を加えて、次世代の解を生成していく。自然淘汰と自己複製をエミュレートしているものと看做す視点から「遺伝的」という命名がされた。
- ヒューリスティクス - 計算資源が限られている状況での近似解を求めることを目的としている。正解を求めるのには適さない。例えば、局所探索法、タブーサーチ、焼きなまし法といった、何らかの無作為性を導入して確率的に解を発見しようとするアルゴリズムがある。例えば焼きなまし法という名前は、冶金学の焼きなましに由来する。加熱と冷却によって金属結晶の欠陥がなくなるように、無作為性を与えて局所的な最適解に陥るのを防ぎ、徐々に無作為性を小さくすることによって最終的に1つの解に落ち着くという手法である。
研究分野による分類
科学のどんな分野にも固有の問題があり、効率的なアルゴリズムが必要とされている。ある分野の問題はまとめて研究されることが多い。そのような分類として、探索アルゴリズム、ソートアルゴリズム、マージアルゴリズム、数値アルゴリズム、グラフアルゴリズム、文字列アルゴリズム、計算幾何アルゴリズム、組合せアルゴリズム、機械学習、暗号理論、データ圧縮アルゴリズム、構文解析などがある。
各分野はオーバーラップしており、ある分野でのアルゴリズムの進歩が、時には全く異なる分野での改善につながることがある。例えば、動的計画法は、本来、産業における資源消費の最適化のために発明されたが、現在では様々な分野での各種問題に適用されている。
計算量による分類
アルゴリズムは、入力長に対する計算時間で分類される。あるアルゴリズムは入力長に対して線形時間で完了する。また別のアルゴリズムは指数時間以上かかるし、場合によっては完了しないこともある。さらに、問題によっては計算量の異なる複数のアルゴリズムが存在するし、効率的なアルゴリズムが全く知られていない問題もある。問題によっては、別の問題への写像が存在する。以上のようなことから、計算量による分類は、アルゴリズムについてではなく、問題について行うのが適当とされている。つまり、問題を解く最善のアルゴリズムの計算量に基づいて、問題を分類する。
計算能力による分類
アルゴリズムは計算能力によっても分類される。一般にアルゴリズムは計算能力によって階層的に分類される。「再帰的クラス」とは、全てのチューリング計算可能関数についてのアルゴリズムを含むクラスである。このような階層化によって、計算に必要とされる計算資源(時間とメモリ)を制限できる可能性が生じる。「部分再帰クラス」は、全てのチューリング計算可能な関数を得ることはできない。例えば、多項式時間で実行されるアルゴリズムには多くの重要な計算が含まれるが、チューリング計算可能な関数全体を含むことはない。原始再帰関数で実装されるアルゴリズムのクラスは、別の部分再帰的クラスの例である。
Burgin (2005, p. 24)[14] は、関数を計算するアルゴリズムは有限ステップ後に必ず出力が決定されなければならないという一般的条件を緩めたアルゴリズムの汎用的定義を行った。彼は「超再帰的クラス」を「チューリングマシンで計算可能でない関数を計算可能なアルゴリズムのクラス」と定義した(Burgin 2005, p. 107)[14]。これはハイパーコンピュータの手法の研究と密接に関係している。
法的問題
特許
アルゴリズム自体は一般に特許化できない。アメリカ合衆国では、抽象概念、数、信号の単純な操作だけから成る請求項は「プロセス」を構成しないとされるので[15]、アルゴリズムは特許化できない。
しかし、アルゴリズムの具体的応用は特許化可能な場合がある。例えば、Diamond v. Diehrのケースでは、単純なフィードバックアルゴリズムを使った合成ゴムの硬化処理が特許として認められた。
データ圧縮アルゴリズムの分野では、ソフトウェア特許が論争の元になることが多く、例えばユニシスのLZWアルゴリズムの特許問題が有名である。
圧縮アルゴリズムで有名な特許問題は他に算術符号も挙げられる。算術符号で取得されている特許の範囲は3点であるとされている。算術符号によって断念されたソフトウェアやファイル形式は多く、代替品が相次いで開発された。
線型計画問題の解法であるカーマーカーのアルゴリズムは日本において特許無効審判がなされたが、2000年12月11日付けで特許庁に当該特許の放棄による特許権抹消の登録が行われたため、最終的に審判が却下された。
著作権
著作権の観点では、日本において著作権法10条3項にて明示的にアルゴリズムが同法の保護対象の外であることが定められている[16]。ただしアルゴリズムを記した文書や、アルゴリズムを実装したプログラムは著作物として保護対象となる[17](文書やプログラムを経由して「アルゴリズムが保護」されるということではない。つまりこの文章は、アルゴリズムについて書いてあるわけではない)。
登録商標
アルゴリズム自体が保護される訳では無いが、商標の基準を満たしていればアルゴリズム名称を商標として登録することはできる。ただしアルゴリズム名称はその性質上から通常は一般名詞として通用するものであり、一般名詞と同じ語について商標の基準を満たして商標として登録しても、一般名詞の一般名詞としての(すなわちごく当然の)使用を妨げるという通念に反するような権利の濫用はできないような商標法上の制限があるため、通常の、商品名などを登録した場合と違い権利は制限される。
その他
暗号アルゴリズムには輸出規制されているものもある(アメリカでの例)。
代表的なアルゴリズム
数学の問題に対するアルゴリズム
- 筆算 - かけ算(尾乗法)、わり算(長除法)
- ユークリッドの互除法 - 最大公約数を求める
- ガウスの消去法 - 線型方程式系(連立方程式)の解を求める
- ニュートン法 - 繰り返し計算により解の精度を高める方法で非線型方程式の数値解を1つ求める
- ガウス=ルジャンドルのアルゴリズム - 円周率を求める
- 素数判定法 - 与えられた自然数が素数かどうかを判定する
- 素因数分解 - 与えられた自然数を素因数分解する
- 高速フーリエ変換(FFT) - 離散フーリエ変換を計算機上で計算する。工学、理学、医療工学などに広く応用されている。例えば、波形データが含む周波数成分を算出するなど。
- 高速乗算法(数、行列など)
設計パラダイム
- 力まかせ探索(ブルートフォース) - 全ての要素を片っ端から調べて探す方法。単純だが非常に汎用的な計算機科学の問題解決法
- 分割統治法
- 動的計画法
- 近似アルゴリズム
- 乱択アルゴリズム(確率的アルゴリズム)
- 遺伝的アルゴリズム
- ヒューリスティクス
- 分散アルゴリズム
- 並列アルゴリズム
各分野の固有の問題に対するアルゴリズム
- 各種線型計算(連立1次方程式、線型固有値問題、特異値問題)
- 数値積分
- 微分方程式の近似解法(常微分方程式、偏微分方程式、確率微分方程式)
- 非線形最適化
- 離散最適化
- グラフ理論における最短経路問題
- ダイクストラ法
- ベルマン-フォード法
- A* - 推定値つきの場合のダイクストラ法。
- データ圧縮(デジタル圧縮)
- ファイル圧縮(ZIP)、画像圧縮(JPEG、GIF)、音声圧縮(MP3)、動画圧縮(MPEG-4、H.264)。
- 誤り検出訂正
- リード・ソロモン符号 - 最も実用化されている誤り訂正符号の一つ。身近なところではQRコードに使われている。アルゴリズムには有限体の理論が応用されている。
- ターボ符号 - 第三世代携帯電話の規格や、宇宙探査機での通信などに使われている。
- LDPC符号 - 最も効率的な誤り訂正符号の一つ。復号法に確率伝播法が応用されているところが特徴。実用化も進められていて、デジタルテレビの衛星通信の標準として採用されている。
- 確率伝播法 - ベイジアンネットワーク上の計算アルゴリズム。人工知能学習や情報理論の分野などに応用されている。
- ページランク - Google社が開発したウェブページの重要度の判定技術
脚注
注釈
出典
- ^ https://kotobank.jp/word/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-532#E7.99.BE.E7.A7.91.E4.BA.8B.E5.85.B8.E3.83.9E.E3.82.A4.E3.83.9A.E3.83.87.E3.82.A3.E3.82.A2
- ^ https://kotobank.jp/word/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-532#E6.94.B9.E8.A8.82.E6.96.B0.E7.89.88.E3.80.80.E4.B8.96.E7.95.8C.E5.A4.A7.E7.99.BE.E7.A7.91.E4.BA.8B.E5.85.B8
- ^ https://kotobank.jp/word/%E3%81%B5%E3%82%8D%E3%83%BC%E3%81%A1%E3%82%84%E3%83%BC%E3%81%A8-3167585#E6.97.A5.E6.9C.AC.E5.A4.A7.E7.99.BE.E7.A7.91.E5.85.A8.E6.9B.B8.28.E3.83.8B.E3.83.83.E3.83.9D.E3.83.8B.E3.82.AB.29
- ^ https://kotobank.jp/ejword/algorithm%20algorism
- ^ https://kotobank.jp/word/%E3%81%B7%E3%82%8D%E3%81%90%E3%82%89%E3%82%80-3168632#E3.83.96.E3.83.AA.E3.82.BF.E3.83.8B.E3.82.AB.E5.9B.BD.E9.9A.9B.E5.A4.A7.E7.99.BE.E7.A7.91.E4.BA.8B.E5.85.B8.20.E5.B0.8F.E9.A0.85.E7.9B.AE.E4.BA.8B.E5.85.B8
- ^ ユークリッド『原論』第 7 巻「数論」、命題 1〜3。
- ^ Erik Gregersen: “Britannica Encyclopedia - Algorithm: Definition, Types, & Facts” (英語). 2023年1月14日閲覧。
- ^ Yuri Gurevich「Sequential Abstract State Machines Capture Sequential Algorithms」ACM Transactions on Computational Logic、第1巻、no 1 (2000年7月)、pages 77–111
- ^ a b c d クリーネ, ステフェン (1952年(初版)). Introduction to Metamathematics (第10版 1991年 ed.). ノースホーランド出版
- ^ クヌース, ドナルド (1997年). Fundamental Algorithms, Third Edition. 米国マサチューセッツ州リーディング: アジソン・ウェスレイ
- ^ a b ミンスキー, マービン (1967年). Computation: Finite and Infinite Machines (初版 ed.). プレンティスホール、米国ニュージャージー州
- ^ Sipser, Michael (2006年). Introduction to the Theory of Computation. PWS出版社
- ^ Kowalski, Robert (1979年). “Algorithm=Logic+Control”. Communications of the ACM (ACM Press) 22 (7): 424–436. doi:10.1145/359131.359136. ISSN 0001-0782.
- ^ a b Burgin, M. Super-recursive algorithms, Monographs in computer science, Springer, 2005. ISBN 0387955690
- ^ 米国特許商標庁 (2006), 2106.02 **>Mathematical Algorithms< - 2100 Patentability, Manual of Patent Examining Procedure (MPEP).
- ^ 著作権なるほど質問箱 - 文化庁
- ^ 基本情報技術者 平成24年春期 午前問78 - 基本情報技術者試験ドットコム
関連項目
- 逐次アルゴリズム
- 並列アルゴリズム
- 分散アルゴリズム/分散プロトコル
- 近似アルゴリズム
- 確率的アルゴリズム
- オンラインアルゴリズム
- 進化的計算
- アルゴリズム作曲法(en)
- データ構造
計算可能性と複雑性の理論の関連
計算モデル関連
外部リンク
- Weisstein, Eric W. "Algorithm". mathworld.wolfram.com (英語).
- Algorithms in Everyday Mathematics
- Algorithms - Curlie
- The web site of the textbook Algorithms, 4th edition by Robert Sedgewick and Kevin Wayne
- 『アルゴリズム』 - コトバンク
アルゴリズム(木構造の場合)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2015/11/08 04:34 UTC 版)
「深さ制限探索」の記事における「アルゴリズム(木構造の場合)」の解説
探索の始点となるノードを決定し、探索すべき深さの上限を決定する。 現在のノードが目標とする状態かどうか調べる。目標状態の場合: 探索成功。終了する。 現在のノードが探索すべき深さの範囲内にあるか調べる。範囲内の場合: ノードを展開し、深さ制限探索を再帰的に呼び出し、ステップ2に戻る。 探索失敗 木構造ではなく一般のグラフの場合、訪問済みのノードかどうかを管理すべき。ただし、深さ優先探索とは異なり、閉路があっても、無限ループに陥ることはない。また、訪問済みのノードを管理するとメモリ不足に陥る場合は、諦めるか、量を制限するかなどをする。
※この「アルゴリズム(木構造の場合)」の解説は、「深さ制限探索」の解説の一部です。
「アルゴリズム(木構造の場合)」を含む「深さ制限探索」の記事については、「深さ制限探索」の概要を参照ください。
アルゴリズム
「アルゴリズム」の例文・使い方・用例・文例
- 毎日大量の株を売買していることから、アルゴリズム取引のユーザーの大半を大手機関投資家が占めている。
- マーティンが発明したアルゴリズムは、株価の変動によってオプション価格がどれくらい変化するかを予測することができる。
- 数字の平方根を探すために、アルゴリズム用の擬似コードを書きなさい。
- あなたの平均を探すアルゴリズムをAとする。
- このソフトウエアはギブスサンプリングのアルゴリズムによりマルコフ連鎖モンテカルロ法の計算を行います。
- アルゴリズムの、アルゴリズムに関する、または、アルゴリズムの特徴がある
- リストを分類するアルゴリズム
- 共通の語幹への語形を減少するために屈折語尾と派生語尾を取り除くためのアルゴリズム
- 微積分学の問題の解決に近似するためのアルゴリズムを研究する数学の部門
- 代数的表現式に類似した命令文を持つアルゴリズム言語
- アルゴリズムを表すために設計された人工言語
- プログラミング言語で、コンピュータプログラムをアルゴリズムとして記述するのに使う
- 意図した結果を得ることに対する間違ったアルゴリズム、または方法の選択から生じるエラー
- 大きな既存のデータベースでのパターンと相関関係を発見するために高度なデータ検索能力と統計アルゴリズムを用いるデータ処理
- コンピューターグラフィックスで,Zバッファアルゴリズムという図形処理の手順
- ワーノック型アルゴリズムという,人間の視覚情報処理の手続きをコンピューターグラフィックス向けに一般化した手順
アルゴリズムと同じ種類の言葉
- アルゴリズムのページへのリンク