アルゴリズムは、明確に定義された計算問題を解決するための特定の手順です。 アルゴリズムの開発と分析は、人工知能、データベース、グラフィックス、ネットワーク、オペレーティングシステム、セキュリティなど、コンピュータサイエンス アルゴリズムの開発によるプログラミング, それには、特定のソリューションに伴うハードウェア、ネットワーキング、プログラミング言語、およびパフォーマンスの制約など、計算問題を解決するために また、手元の問題を完全かつ効率的に解決するという意味で、アルゴリズムが”正しい”ことが何を意味するのかを理解する必要があります。

付随する概念は、アルゴリズムを効率的に実行できるようにする特定のデータ構造の設計です。, データ構造の重要性は、コンピュータのメインメモリ(データが格納されている)が線形であり、直列に番号が付けられたメモリセルのシーケンスからなるとい0, 1, 2,…. したがって、最も単純なデータ構造は線形配列であり、隣接する要素には連続した整数の”インデックス”が付けられ、要素の値には一意のインデックスによってアクセスされます。 たとえば、配列を使用して名前のリストを格納することができ、配列から特定の名前を効率的に検索および取得するには効率的な方法が必要です。, 例えば、リストをアルファベット順に並べ替えることで、各ステップで検索されるリストの残りの部分を半分にカットする、いわゆるバイナリ探索技 この検索手法は、電話帳で特定の名前を検索するのと似ています。 本がアルファベット順であることを知ることで、目的の名前を含むページに近いページにすばやく目を向けることができます。 多くのアルゴリズムの開発のための仕分け、検索のリストのデータを効率的に,

データアイテムはメモリに連続して格納されますが、ポインタ(基本的には、構造内の次のアイテムまたはアイテムが見つかった場所を示すためにアイテムと一緒に格納されたメモリアドレス)によって一緒にリンクされることがあり、データがアクセスされる方法と同様の方法で編成されることがあります。 このような最も単純な構造は、リンクリストと呼ばれ、リスト内のある項目から次の項目へのポインタに従うことによって、連続して格納されていない項目に事前に指定された順序でアクセスすることができる。, リストは、最後の項目が最初の項目を指す円形であってもよく、または各要素が二重にリンクされたリストを形成するための両方向のポインタを有 アルゴリズムは,項目の検索,挿入,削除によってこのようなリストを効率的に操作するために開発された。

ポインタは、より複雑なデータ構造を実装する機能も提供します。 たとえば、グラフは、アイテムのペアを接続するノード(アイテム)とリンク(エッジとして知られている)のセットです。, このようなグラフは、都市とそれらを結ぶ高速道路のセット、回路要素のレイアウトとメモリチップ上の接続ワイヤ、またはソーシャルネットワークを介して対話する人の構成を表すことがあります。 典型的なグラフアルゴリズムには、各ノードが一度だけ訪問されるように、ノードからノードへのリンクをたどる方法(おそらく特定のプロパティを持つノード 関連する問題は、任意のグラフ上の二つの与えられたノード間の最短経路の決定である。 (グラフ理論を参照。,)たとえば、ネットワークアルゴリズムにおける実用的な関心の問題は、通信が失敗し始める前に許容できる”壊れた”リンクの数を決定することです。 同様に、非常に大規模集積(VLSI)チップ設計では、回路を表すグラフが平面であるかどうか、すなわちリンクが交差する(ワイヤが触れる)ことなく二次元で描

アルゴリズムの(計算の)複雑さは、特定のアルゴリズムが実行するときに消費する計算リソース(時間と空間)の量の尺度です。, コンピュータ科学者は、コードを書く前に、アルゴリズムがどれくらい速く実行され、どれくらいのメモリが必要かを予測できる複雑さの数学的尺度を使 などの予測が重要なガイドのためのプログラマの実施および選択アルゴリズム。,

計算の複雑さは連続体であり、いくつかのアルゴリズムは線形時間を必要とする(つまり、処理されるリスト、グラフ、またはネットワーク内の項目またはノードの数に応じて必要な時間が直接増加する)のに対し、他のアルゴリズムは二次または指数関数的な時間を必要とする(つまり、必要な時間は平方アイテムの数またはその数の指数関数的な時間とともに増加する)。 この連続体の遠端には、手に負えない問題の暗い海があります—その解決策を効率的に実装することができません。, これらの問題に対して、コンピュータ科学者は、問題をほぼ解決し、合理的な時間で実行できる発見的アルゴリズムを見つけようとしています。

さらに離れているのは、述べることができるが解決できないアルゴリズム問題である。 解決不可能なアルゴリズム問題の古典的な例は停止問題であり、有限数のステップの後に他のプログラムが停止するかどうかを予測できるプログラムは記述できないと述べている。, 停止問題の解けないことは,ソフトウェア開発に即時実用的な関係を持っている。 例えば、開発中の別のプログラムが無限ループを持っているかどうかを予測するソフトウェアツールを開発しようとするのは軽薄です(そのようなツール