Chapter 22
科目A-1|アルゴリズムとプログラミングの用語を順に解説します。
配列とは配列(Array)とは、複数のデータをコンピュータのメモリ上に一列に並べて管理する最も基本的なデータ構造です。配列内の個々のデータを「要素」と呼び、各要素には「0」から始まる「インデックス(添え字)」という番号が割り当てられます。メモリ上で連続した領域に保存されるため、インデックスを指定するだけで、目的のデータへ瞬時にアクセスできる特徴を持っています。具体例1週間の気温データ(月曜〜日曜までの7日分)を一つの変数にまとめて管理し、特定の曜日の気温を取り出すようなケースです。// 7日分の気温を配列で管理する
リストとはリスト(連結リスト:Linked List)とは、データそのものと「次のデータがメモリ上のどこにあるかを示す情報(ポインタ)」をセットにした要素(ノード)を、鎖のようにつなぎ合わせて複数のデータを管理するデータ構造です。配列と違い、データがメモリ上でバラバラの位置にあっても問題なく、データの追加や削除をする際に周りのデータをズラす必要がないため、途中の挿入・削除が非常に素早く行える利点があります。具体例列車の車両連結の仕組みに似ています。車両(ノード)が連結器(ポインタ)で繋がっており、3両目と4両目の間
スタックとはスタック(Stack)とは、データを一時的に保存するデータ構造の一種で、最初に入れたデータが最後に出てきて、最後に入れたデータが最初に出てくる「後入れ先出し(LIFO:Last In, First Out)」というルールで管理される仕組みです。データを積み上げるイメージで、一番上にデータを追加する操作を「プッシュ(Push)」、一番上からデータを取り出す操作を「ポップ(Pop)」と呼びます。具体例Webブラウザの「戻る」ボタンの機能です。新しいページを開くたびに履歴データがスタックにプッシュ(積み上げ)
キューとはキュー(Queue)とは、データを一時的に保存するデータ構造の一種で、最初に入れたデータが最初に出ていき、最後に入れたデータは最後に出ていく「先入れ先出し(FIFO:First In, First Out / 待ち行列)」という規則で管理される仕組みです。列の最後尾にデータを追加する操作を「エンキュー」、列の先頭からデータを取り出す操作を「デキュー」と呼びます。具体例プリンターの印刷処理が代表的な例です。複数のパソコンから送られてきた印刷指示(データ)はキューに溜められ、送信されたのが早い順(先に入った指
木構造とは木構造(Tree Structure)とは、データ同士のつながりを親子関係(階層的)で表現したデータ構造です。樹木を逆さまにしたような形で表され、最上位にある一番大元の要素を「根(ルーツ)」、そこから枝分かれした途中の要素を「節(ノード)」、枝の最下端にある要素を「葉(リーフ)」と呼びます。上から下へ一方通行の親子関係があるのが特徴です。具体例パソコンのフォルダ(ディレクトリ)管理がもっとも身近な例です。ハードディスク(Cドライブなど)が「根」となり、その中に複数のフォルダ(節)があり、各フォルダの中に具
二分探索木とは二分探索木(Binary Search Tree)とは、木構造の中でも「各ノード(要素)が持つ子供は最大で2つまで(二分木)」であり、かつデータが一定の配置ルールに従って整理された構造です。そのルールとは、「あるノードを基準として、その左側には親より小さい値、右側には親より大きい値のデータだけを置く」というものです。この配置により、目的のデータを検索するスピードが非常に早くなります。具体例値「8」を根として、複数の数値をこのルールで配置した木構造です。「5」を探す場合、根の「8」より小さいので左側に進
ヒープとはヒープ(Heap)とは、木構造(特に完全二分木)を利用したデータ構造の一種で、「親ノードの値が、子ノードの値よりも常に大きい(または常に小さい)」という親子関係のルールを木全体で保っている状態のことです。このルールを守ることにより、木の一番上(根)には常に「最大値」または「最小値」のデータが配置されることになります。最大(小)値を素早く取り出す用途に適しています。具体例「優先度付きのタスク処理システム」において、最も優先度の高いタスク(最大値)をすぐに取り出したい場合にヒープが使われます。根にある最高優先
ハッシュ表とはハッシュ表(Hash Table)とは、「ハッシュ関数」と呼ばれる特別な計算式を用いて、探したいデータの「キー(名前など)」から、そのデータが格納されるメモリ上の「アドレス(インデックス番号)」を直接算出して管理するデータ構造です。最初からデータの場所が計算で分かるため、データ数が膨大になっても、データの追加や検索をほぼ一瞬(一定時間)で行うことができます。具体例会員名簿データベースで、「会員ID」をハッシュ関数に入力すると「保存されている部屋の番号」が計算され、そこから直ちに会員の住所や名前を引き出
グラフとはグラフ(Graph)とは、データ同士の複雑な「つながりや関係性」を表現するためのデータ構造です。個々のデータを「頂点(ノード)」、つながりを示す線を「辺(エッジ)」と呼びます。辺に矢印(向き)があるものを「有向グラフ」と呼び、一方通行のルートなどを表します。向きがないものは「無向グラフ」と呼び、双方向のつながりを表します。具体例電車の路線図が代表的な例です。各駅が「頂点」、駅間をつなぐ路線が「辺」となります。また、SNSの人間関係において、ユーザーが「頂点」、フォロー関係(片方向の矢印)が「辺」となるのも
線形探索とは線形探索(Linear Search / リニアサーチ)とは、データ群の中から目的のデータを探し出すための、最もシンプルで原始的な検索アルゴリズムです。配列やリストの端(先頭など)から順に、1つずつ目的の値と一致するかどうかを比較していきます。データが事前に並べ替えられていなくても探索できる利点がありますが、データ数が多くなると比較回数が増えて時間がかかる欠点もあります。具体例裏向きに並べられたトランプの山から「ハートのA」を見つけるために、左端から順に1枚ずつめくって、ハートのAが出るまで確認していく
二分探索とは二分探索(Binary Search / バイナリサーチ)とは、あらかじめ昇順または降順に並べ替え(ソート)されているデータ群から、目的のデータを素早く見つけるためのアルゴリズムです。データ全体の中央にある値を確認し、目的の値がそれより「大きいか」「小さいか」を判断します。それによって探索範囲を半分(二分)に絞り込むことを繰り返し、高速に目的地に到達します。具体例国語辞書で「さくら」という言葉を探すとき、まず本のちょうど真ん中のページを開き、そこが「た行」であれば「さ行」はそれより前にあると判断して、前
バブルソートとはバブルソート(Bubble Sort / 交換法)とは、データ群を並べ替えるソートアルゴリズムの一種で、隣り合う2つのデータの大小を比較し、順序が逆であれば入れ替えるという操作を、配列の端から順に繰り返す方法です。この操作を繰り返すと、軽い(値が小さい)要素が徐々に上に上がり、重い(値が大きい)要素が底へ沈むように並び替わります。泡(バブル)が浮かび上がってくる様子に似ていることから名付けられました。具体例バラバラに並んだ「5, 3, 8, 2」を昇順にする際、まず隣の5と3を比較して入れ替え「3,
選択ソートとは選択ソート(Selection Sort)とは、データ群を並び替えるアルゴリズムの一つで、データの中から「最小値(または最大値)」を見つけ出し、それを未整列の部分の先頭と入れ替える操作を繰り返す手法です。「最小値を選択して前に持ってくる」というルールをシンプルに繰り返すことで、配列の左側から順番に整列されたデータが確定していきます。具体例トランプのカードがバラバラに置かれているとき、その中から一番数字の小さいカードを目で探して(選択して)一番左側に置きます。次に、残りのカードから一番小さいカードを探し
挿入ソートとは挿入ソート(Insertion Sort)とは、データ群を並び替えるためのアルゴリズムの一つです。配列を「すでに整列し終わった部分」と「まだ整列していない部分」に分け、未整列の部分からデータを1つずつ取り出し、整列済みのデータ群の中の「正しい位置」を探して差し込み(挿入し)ていくことで、全体をソートします。すでにある程度整列されているデータに対して非常に速く動作します。具体例手札のトランプカードを整理する際、新しくめくったカード(未整列)を手元のすでに数字順に並んでいるカード(整列済み)の中を見て、適
クイックソートとはクイックソート(Quick Sort)とは、実用上で極めて高速に動作する代表的なソートアルゴリズムです。「分割統治法」と呼ばれる考え方に基づいており、まずデータの中から基準値(ピボット)を1つ決めます。次に、基準値より「小さい値のグループ」と「大きい値のグループ」の2つにデータを分けます。分けたそれぞれのグループに対して、再び同じルールでピボットを決めて二分する操作を再帰的に繰り返します。具体例学校でクラス全員を背の順に並べる際、適当な人(ピボット)を1人選び、「その人より背が低い人は左側、高い人
マージソートとはマージソート(Merge Sort / 併合ソート)とは、並べ替えアルゴリズムの一つで、データ群を要素が1個になるまで細かく(半分ずつに)分解したあと、並び順が正しくなるように合体(マージ)させながら、元の大きさに戻していくことで整列を行う手法です。常に安定した時間で処理できる性質があり、データの順序が崩れない「安定ソート」であることも特徴です。具体例2つの「すでに数字順に綺麗に並んだトランプの束」を1つにまとめる際、それぞれの束の先頭(一番上)にあるカードをめくって小さい方を新しい束に重ねていくこ
ヒープソートとはヒープソート(Heap Sort)とは、「ヒープ」と呼ばれる親子間の値に一定の大小関係ルールがある木構造を利用して、データを並べ替えるアルゴリズムです。ヒープの根(一番上)には必ず最大値(または最小値)が配置されるという特徴を利用し、根にある最大値を取り出して配列の末尾に移動させ、残りのデータで再びヒープを再構築する操作をデータがなくなるまで繰り返します。具体例バラバラに積まれた複数の箱から、最も重い箱(最大値)を取り出して並べていきます。取り出したあと、残された箱の山から自動的に「次に最も重い箱」
再帰とは 再帰(さいき)とは、ある関数や処理の中で、自分自身を呼び出すプログラミングの技法のことです。「再帰呼出し」とも呼ばれます。複雑な問題を、より小さな同じ形の問題に分割して解決したいときに非常によく使われます。再帰を使うことで、複雑な繰り返し処理をシンプルで読みやすいコードとして記述することができます。ただし、自分自身を呼び出す処理が無限に続かないよう、処理を終了するための「ベースケース(終了条件)」を必ず記述しなければなりません。これがないと、プログラムが無限ループに陥り、パソコンのメモリを使い果たして強制
計算量とは 計算量(けいさんりょう)とは、コンピュータがあるプログラムを実行する際に、どれだけの「時間」や「メモリの量」を必要とするかを表す指標です。プログラムの性能や効率の良さを測るために使われます。データ数が多くなったときに、処理にどれくらい時間がかかるかを示すものを「時間計算量」、どれくらいメモリを消費するかを示すものを「領域計算量」と呼びます。計算量は一般的に「O記法(オー記法)」を用いて「O(N)」や「O(N^2)」のように表記されます。Nは処理するデータの数です。この値が小さいほど、データが増えても高速
貪欲法とは 貪欲法(どんよくほう)とは、問題を解決するアルゴリズムの設計手法の一つです。「グリーディ法」とも呼ばれます。この手法の特徴は、問題を解決していく各段階において、将来の影響を一切考えず、その時点で最も有利に見える選択(局所的な最適解)を繰り返し選んでいくことです。全体にとっての最終的な正解(全体最適解)が必ず得られるとは限りませんが、処理が非常にシンプルであり、計算速度が極めて速いという大きなメリットがあります。素早く「そこそこ良い答え」を見つけたい場合や、特定の条件を満たした問題に対して有効なアプローチ
動的計画法とは 動的計画法(どうてきけいかくほう)とは、複雑な問題を解くためのアルゴリズム設計手法の一つです。英語では「Dynamic Programming(DP)」と呼ばれます。この手法では、大きな問題をいくつかの小さな問題に分割し、それぞれの小さな問題の答えを一度だけ計算して、その結果をメモリなどに記録しておきます。そして、より大きな問題を解く際に、すでに記録してある計算結果を再利用することで、無駄な重複計算をなくし、処理効率を劇的に高めることができます。同じ計算を何度も繰り返してしまうような問題に対して、非
幅優先探索とは 幅優先探索(はばゆうせんたんさく)とは、グラフや木構造といったデータ構造のすべての要素を調べる(探索する)ための代表的なアルゴリズムの一つです。英語の「Breadth-First Search」の頭文字をとって「BFS」とも呼ばれます。この探索法の特徴は、出発地点に近い階層から順番に、横方向(同じ深さの要素)をすべて調べ尽くしてから、次の深い階層へと進んでいくことです。スタート地点からの距離が近い順に調べていくため、最短経路(最も少ないステップ数でのゴール)を見つける問題に非常に適しています。実装に
深さ優先探索とは 深さ優先探索(ふかさゆうせんたんさく)とは、グラフや木構造などのデータ構造を探索するための代表的なアルゴリズムの一つです。英語の「Depth-First Search」の頭文字をとって「DFS」とも呼ばれます。この探索法の特徴は、ある経路を選んだら、突き当たり(葉ノード)に達するまでひたすら深く進み、行き止まりになったら一歩戻って(バックトラック)別のルートを探索する、という手順を繰り返すことです。メモリの消費量を抑えやすいという特徴があり、迷路の全ルートを調べたり、パズルなどの条件を満たす組み合
疑似言語とは 疑似言語(ぎじげんご)とは、プログラムの処理手順(アルゴリズム)を人間にとって分かりやすく表現するために作られた、架空のプログラミング言語のことです。実際のコンピュータ上でそのまま実行することはできませんが、特定のプログラミング言語(JavaやPython、C言語など)の細かな書き方のルールにとらわれず、アルゴリズムの論理的な構造や流れだけを整理して伝えるために用いられます。日本のIT国家試験である「情報処理安全確保支援士試験の科目A-1」などの問題文でも、プログラミング能力の本質的な考え方を問うため
変数とは 変数(へんすう)とは、プログラムの中でデータ(数値や文字など)を一時的に記憶しておくために用意する、名前のついた「箱」のようなものです。プログラムは、この箱に値を入れたり(代入)、入っている値を取り出したり(参照)、あるいは値を書き換えたりしながら様々な計算や処理を行います。変数を使うことで、同じ値を何度も使い回すことができ、プログラムの記述をすっきりと整理できます。また、値の中身が途中で変わる場合でも、変数名を使って共通の処理を書いておけば、柔軟に計算を実行できるという大きなメリットがあります。 具体例
大域変数とは 大域変数(たいいきへんすう)とは、プログラムのどこからでも読み書きができる変数のことです。「グローバル変数」とも呼ばれます。これに対して、特定の関数や処理ブロックの内部だけでしか使えない変数を「局所変数(ローカル変数)」と呼びます。大域変数はプログラム全体の共通データ(アプリの設定やログイン中のユーザー情報など)を管理するのに便利ですが、どこからでも書き換えられてしまうため、意図しない場所で値が変更され、プログラムに予期せぬバグを引き起こす原因になりやすいというデメリットがあります。そのため、プログラ
引数とは 引数(ひきすう)とは、プログラムの中で関数(特定の処理をまとめた命令セット)を呼び出す際に、呼び出し元から関数へと渡すデータ(値や変数)のことです。関数に処理を依頼する際、「このデータを使って処理してください」と指示するための情報と言えます。関数を定義するときに受け取り側として用意する変数を「仮引数(かりひきすう)」、実引数(じつひきすう)と呼びます。引数を使うことで、一つの関数を様々なデータに対して再利用できるようになり、効率的な開発が可能になります。 具体例 消費税を計算する「taxCalculato
関数とは 関数(かんすう)とは、特定の目的を持った一連の処理(計算や操作など)をひとまとめにして、名前をつけたプログラムの部品のことです。別の言葉で「手続」や「プロシージャ」とも呼ばれます。同じような処理を何度も行う場合、毎回同じコードを書く代わりに、その処理を関数として定義しておくことで、必要なときにいつでも名前を呼び出すだけで実行できるようになります。関数には、外部からデータを受け取る「引数(ひきすう)」や、処理した結果を呼び出し元に返す「戻り値(もどりち)」を設定することができ、これらを組み合わせることで柔軟
オブジェクト指向とは オブジェクト指向(オブジェクトしこう)とは、ソフトウェア開発における設計思想(考え方)の一つです。プログラムを単なる命令の並びとして捉えるのではなく、データとそれを操作する処理をひとまとめにした「オブジェクト(モノ)」として定義し、そのオブジェクト同士が互いにメッセージをやり取りしながら全体を動かしていくというアプローチです。現実世界に存在する「車」や「人間」「注文」といったモノや概念をプログラム上に再現するため、システム全体の構造が理解しやすくなり、大規模なソフトウェアでも部品の再利用や修正
クラスとは クラスとは、オブジェクト指向プログラミングにおいて、オブジェクト(モノ)を作り出すための「設計図」や「型」にあたるものです。この設計図に基づいて実際にメモリ上に作成された具体的なモノを「インスタンス」または「オブジェクト」と呼びます。クラスには、そのモノが持つべき情報である「属性(データ・変数)」と、そのモノができる操作である「メソッド(処理・関数)」を定義しておきます。設計図であるクラスを一度作っておけば、同じ性質を持つインスタンスをプログラムの中でいくつでも簡単かつ大量に生成することができます。 具
継承とは 継承(けいしょう)とは、オブジェクト指向プログラミングにおいて、すでにあるクラス(親クラス / スーパークラス)の機能や特徴を引き継いで、新しく別のクラス(子クラス / サブクラス)を作る仕組みのことです。英語では「インヘリタンス」と呼ばれます。継承を使用することで、親クラスに定義されたデータ(属性)や処理(メソッド)を子クラスで再度記述する必要がなくなり、プログラムのコード量を大幅に削減できます。また、親クラスの機能を活かしつつ、子クラスに独自の機能を追加したり、一部の機能を上書き(オーバーライド)して
カプセル化とは カプセル化(かぷせるか)とは、オブジェクト指向プログラミングにおいて、データ(変数)とそれを操作する処理(メソッド)を一つのオブジェクト(クラス)にまとめ、外部から直接データを覗き見たり、勝手に書き換えたりできないように保護する仕組みのことです。薬のカプセルのように、中身(不要な詳細情報や重要な設定値)を隠蔽して安全に保護します。外部とのやり取りは、専用の公開された窓口(メソッド)を介してのみ行うルールにすることで、プログラムの他の部分からの不正なアクセスを防ぎ、システムの安全性や独立性を高めること
ポリモーフィズムとは ポリモーフィズムとは、日本語で「多態性(たたいせい)」や「多様性」と呼ばれるオブジェクト指向プログラミングの重要な概念です。これは、異なる種類のオブジェクトに対して同じ名前の命令(メソッド)を送ったとしても、それぞれのオブジェクトが自身の特性に合わせて、異なる動作を行うことができる仕組みを指します。呼び出し側のプログラムは、相手が誰であるかを詳しく知らなくても、共通のインターフェースを通じて同じ方法で命令を送るだけで済むため、プログラム全体の記述が非常にシンプルになり、将来の拡張も容易になりま
コンパイラとは コンパイラとは、人間が記述したプログラミング言語のソースコードを、コンピュータが直接理解して実行できる形式(機械語)に、一括して翻訳するためのプログラムのことです。この翻訳する作業自体を「コンパイル」と呼びます。プログラムを実行する前にあらかじめ全てのコードを翻訳し、実行ファイル(Windowsの「.exe」など)を作成するため、プログラムの実行速度が非常に速いという特徴があります。ただし、翻訳の途中でコードに1箇所でも文法エラーがあると実行ファイルを生成できず、開発中に修正とコンパイルを繰り返す手
インタプリタとは インタプリタとは、人間が書いたプログラミング言語のソースコードを、コンピュータが理解できる形式に「1行ずつ翻訳しながら、その場で同時に実行していく」方式のプログラム、またはその翻訳仕組みのことです。前もって全体の翻訳を完了させておく「コンパイラ」とは異なり、事前の変換作業が不要です。そのため、プログラムを書き換えたらすぐに実行して動作を確認できるため、開発の手間が少なく、テストを繰り返しやすいというメリットがあります。一方で、実行しながら1行ずつ翻訳を行うため、実行ファイルを作成して走らせるコンパ
リンカとは リンカ(Linker)とは、プログラミングにおいて、ソースコードを翻訳(コンパイル)して作成された「オブジェクトファイル(中間データ)」や、外部の「ライブラリ」などを一つにつなぎ合わせ(リンクし)、最終的なコンピュータが実行できるファイル(実行ファイル)を作成するプログラムのことです。プログラムの開発では、コードが大きくなると複数のファイルに分けて記述したり、共通処理として用意されている外部のプログラム(ライブラリ)を利用したりします。これらをパズルのように正しく組み上げて、一つの動くアプリとして完成さ
ライブラリとは ライブラリ(Library)とは、頻繁に利用される便利なプログラムや特定の機能(画像処理、日付計算、通信など)を、他のプログラムから簡単に呼び出して再利用できるようにひとまとめにしたファイル群のことです。「図書館」を意味する名前の通り、役立つプログラムが整理して保管されています。ライブラリを利用することで、開発者は複雑な処理をゼロから自分でプログラミングする必要がなくなり、開発に必要な時間や手間を大幅に削減できます。また、すでに十分にテストされ、安定して動作することが確認されているため、プログラムの
マークアップ言語とは マークアップ言語とは、文章の構造や装飾(デザイン)をコンピュータに指示するために、テキストに特別な記号(タグ)を埋め込んで記述する言語のことです。「マークアップ(目印をつける)」という名前の通り、見出しや段落、リンク、画像といった文章の要素をタグで囲むことで、単なるテキストファイルに構造を与えます。プログラミング言語のように複雑な計算や論理処理を行うのではなく、データの見た目や構成を定義することが主な役割です。代表的なマークアップ言語には、ウェブページを作成する「HTML」や、データ構造を自由
JSONとは JSON(ジェイソン)とは、「JavaScript Object Notation」の略で、データの記述や受け渡しによく使われる軽量なテキストフォーマットのことです。人間にとって読み書きがしやすく、コンピュータにとっても解析(パース)や生成が非常に簡単であるため、現代のウェブ開発において異なるシステム間でデータをやり取りする(Web APIなど)際の標準的な形式として広く普及しています。JavaScriptのオブジェクトの書き方をベースにしていますが、特定のプログラミング言語に依存せず、Pythonや
公式資料へのリンクと確認日を各記事に掲載しています。