››
テクノロジ系 45 問のうち、この章は 5〜8 問ほどの出題があります。「アプリがデータをどう整理して保管しているの?」「1000 件の中から目的のデータを探すのに、どうすれば速いの?」「プログラミング言語はなぜあんなに種類があるの?」「問題集に出てくる擬似言語って何?」といった、コンピュータに手順を教えて動かすための基礎を扱う章です。
特に**擬似言語(iパス独自の読解用コード)を追跡する問題が毎年必ず**出題されます。数式を計算する数学とは違い、「順番どおりに実行して結果を求める」思考訓練が必要です。慌てず、変数の値を紙に書きながら一歩ずつトレースするのが鉄則。
この章を読み終えた時点で、以下ができるようになっていることを目指します。
試験では: データ構造は「用途 → 最適な構造」、アルゴリズムは「計算量の比較」、擬似言語は「与えられた入力で何を出力するか」の 3 パターンが定番です。
データ構造は「データを整理して保管する形」。同じ情報でも**整理の仕方で、追加・検索・削除のしやすさが大きく変わります。たとえばスーパーで買い物リストを作るとき、順番に書く**(配列)か、優先順位の列(キュー)か、積み上げていく(スタック)かで、使い勝手が変わるのと同じ。用途に応じて最適な構造を選ぶのがプログラマーの腕の見せどころで、試験でも「この場面ではどの構造を使うか」が頻出です。
配列は同じ型のデータを連続した領域に並べたもの。一番シンプルで基本的なデータ構造で、「何番目」(インデックス)を指定すれば一瞬で取り出せるのが特徴。ただし途中に要素を挿入したり削除したりすると、後続の要素を全部ずらす必要があるので遅くなります。
具体例: 生徒 30 人の点数を配列scores[0]〜scores[29] で保管。3 番目の生徒の点数は scores[2] で一瞬で取れる。ただし「5 番目と 6 番目の間に新しい生徒を挿入」すると、6 番目以降 25 人分を 1 つずつ後ろにずらす必要がある。
リスト(連結リスト)は、各要素が**「次の要素の場所を指すポインタ」を持つデータ構造。配列とは逆に、挿入・削除が速く、検索が遅い**という特性があります。メモリ上でバラバラな位置にあっても、ポインタでつなげて論理的な順序を保ちます。
引っかけ: 配列は検索速い・挿入遅い、リストは挿入速い・検索遅い。正反対の特性なので、用途で使い分ける。頻繁に検索するなら配列、頻繁に挿入・削除するならリスト。
スタックは「積み重ねた皿」のように、最後に入れたものが最初に出るデータ構造。略して LIFO(Last In, First Out、後入れ先出し)と呼びます。プログラムの関数呼び出し(どこから呼ばれたかを覚えて戻る)や、エディタの Undo 機能(直前の操作を取り消す)で使われています。
具体例: エディタで「A を入力 → B を入力 → C を入力 → Undo」とすると、直前に入力した C が最初に取り消される。これは入力履歴をスタックに push し、Undo で pop しているから。
キューは「レジの行列」のように、最初に入ったものが最初に出るデータ構造。略して FIFO(First In, First Out、先入れ先出し)。プリンタの印刷待ち行列、メッセージキュー、タスクスケジューラなど、順番待ちが必要な場面で広く使われます。
スタック(LIFO)
後入れ先出し
| 位置 | 要素 |
|---|---|
| 頂上 ← pop | C(最後に push) |
| B | |
| 底 | A(最初に push) |
最後に積んだ C が最初に出る
用途: 関数呼び出し、Undo(やり直し)、数式の括弧解析
キュー(FIFO)
先入れ先出し
最初に入れた A が最初に出る
用途: 印刷待ち行列、メッセージキュー、タスクスケジューラ
頻出引っかけ: スタック = 紙を縦に積む(LIFO)、キュー = レジの行列(FIFO)のイメージ。「お客さんが並んでいる順番に対応する」のがキュー、「重ねた皿を上から取る」のがスタック。pop / push / enqueue / dequeue の用語も区別。
木構造は階層関係を表現するデータ構造。フォルダ階層、組織図、HTML/XML の構造など、身の回りに溢れています。家系図を上下逆さにした形(根が上、葉が下)で表現するのが慣習です。
具体例: PC のフォルダ階層は木構造そのもの。「デスクトップ > プロジェクト > 2026 > 資料.docx」という階層は、デスクトップを根(ルート)として下に枝分かれする木。HTML の <html> > <body> > <div> も同じ構造。
グラフは「ノード(点)」と「エッジ(線)」で**物事のつながりを表す**データ構造。SNS の友達関係、地図の道路網、Web ページのリンク構造など、**ネットワーク状の関係を扱うのに使います。木構造と違い、閉路(ループ)や複雑な網状**も表現できます。
具体例: Google マップの「最短経路検索」はグラフ探索の典型。交差点をノード、道路をエッジ、距離や所要時間を重みとして、目的地までの最短経路を**ダイクストラ法**などで計算しています。
ハッシュテーブルは、キーから直接場所を計算して高速に検索できるデータ構造。辞書(dict)や連想配列(Map)とも呼ばれます。平均 O(1) で検索・挿入できる最強クラスの速さが特徴で、Python や JavaScript の dict / Object などの標準データ型として組み込まれています。
具体例: 社員番号 → 社員情報 の検索で、配列や線形探索なら全員スキャンが必要だが、ハッシュテーブルなら**社員番号をハッシュ関数で変換**してすぐにデータ位置がわかる。100 万人規模でも一瞬。
アルゴリズムは「問題を解く手順」のこと。同じ問題を解くにも**複数の手順があり、計算量(処理時間の増加率)**で比較します。データが 1 万件か 100 万件かで、最適な手順は変わってきます。試験では **「線形探索 vs 二分探索」「バブルソート vs クイックソート」**の計算量比較が定番です。
探索は「データの中から目的の値を見つける」処理。データがソート済みかどうかで、使えるアルゴリズムが大きく変わります。ソートされていないデータには**線形探索しか使えないが、ソート済みデータなら二分探索**で圧倒的に速くなります。
| アルゴリズム | 特徴 | 計算量 | ソート前提 |
|---|---|---|---|
| **[[線形探索 | せんけいたんさく]]** | 先頭から順に比較 | O(n) |
| **[[二分探索 | にぶんたんさく]]** | ソート済みデータを半分ずつ絞る | O(log n) |
| **[[ハッシュ探索 | ハッシュたんさく]]** | ハッシュ関数で直接アクセス | O(1) |
二分探索の動作(ソート済み配列 [1,3,5,7,9,11,13,15] から 11 を探す)
Step 範囲 中央 比較 次の範囲 1 [1,3,5,7,9,11,13,15] 7 11 > 7 右半分 [9,11,13,15] 2 [9,11,13,15] 11 一致 ✓ 発見 2 ステップで発見(線形探索なら最大 6 ステップ)
n=8 で比較: 線形探索 = 最大 8 回(O(n)) / 二分探索 = 最大 3 回(O(log n)) n=10⁶ なら 100 万回 vs 20 回 — n が大きいほど差が広がる
頻出引っかけ: 二分探索は「ソート済み」が前提。ソートされていない配列に二分探索は使えない。一方、線形探索はソート不要。データ量が大きい場合「事前ソート + 二分探索」が「線形探索」より圧倒的に速くなる。
整列(ソート)はデータを大小順に並べ替える処理。単純な手法(バブル・選択・挿入)は実装が簡単だが遅い(O(n²))、高度な手法(クイック・マージ・ヒープ)は**実装は複雑だが速い**(O(n log n))。データ量が少なければ単純な手法でも十分、数万件以上なら高度な手法が必須です。
| アルゴリズム | 特徴 | 計算量 |
|---|---|---|
| バブルソート | 隣接を比較交換。シンプル | O(n²) |
| **[[選択ソート | せんたくソート]]** | 最小値を先頭へ繰り返し |
| **[[挿入ソート | そうにゅうソート]]** | 整列済み部分に挿入 |
| クイックソート | 基準値(pivot)で分割 | 平均 O(n log n) |
| マージソート | 分割統治で統合 | O(n log n) |
| ヒープソート | ヒープ構造を利用 | O(n log n) |
覚え方: 単純系 3 兄弟(バブル・選択・挿入)は O(n²)、高速系 3 兄弟(クイック・マージ・ヒープ)は O(n log n)。計算量の桁違いは、n=10,000 で**単純系 1 億回 vs 高速系 13 万回**という圧倒的な差になる。
再帰は関数が自分自身を呼び出す仕組み。複雑な処理を「自分と同じ問題の小さい版」に分解して解くアプローチで、木構造の探索や分割統治法などで必須のテクニックです。プログラムが直感的に書けるが、**停止条件**を間違えると無限ループになるので注意。
例: 階乗の計算
function 階乗(n):
if n == 0: return 1
return n × 階乗(n - 1)
計算量は「入力サイズ n が大きくなったとき、処理時間がどう増えるか」を表す尺度。O 記法(ビッグオー記法)で表します。コンピュータの性能が上がっても、計算量が悪いアルゴリズムは大規模データで実用不能になります。データ量に応じて適切なアルゴリズムを選ぶための指標です。
| 記法 | 名称 | 例 | 特徴 |
|---|---|---|---|
| O(1) | 定数時間 | 配列のインデックスアクセス、ハッシュ探索 | 最速。データ量に依存しない |
| O(log n) | 対数時間 | 二分探索、平衡木の探索 | 非常に速い |
| O(n) | 線形時間 | 線形探索、配列の最大値検索 | データ量に比例 |
| O(n log n) | 準線形時間 | クイックソート、マージソート | ソートの実用限界 |
| O(n²) | 二乗時間 | バブルソート、選択ソート、二重ループ | 大規模データで遅い |
| O(2^n) | 指数時間 | 部分集合の列挙、総当たり探索 | 実用困難 |
具体例(n=1,000 のとき): O(1) = 1 操作 / O(log n) ≈ 10 / O(n) = 1,000 / O(n log n) ≈ 10,000 / O(n²) = 1,000,000 / O(2^n) = 事実上無限。桁違いの差が出るので、計算量の低いアルゴリズムを選ぶことが重要。
プログラミング言語は人間がコンピュータに命令するための言語。用途によって得意分野が異なるため複数の言語が存在し、現代のエンジニアは2〜3 言語を状況で使い分けるのが普通です。試験では「この用途に最適な言語は?」「コンパイラ型とインタプリタ型の違い」などが頻出します。
プログラミング言語はいくつかの軸で分類できます。機械語への距離で「低水準・高水準」、実行方式で「コンパイラ型・インタプリタ型」、使い方で「スクリプト言語」など、複数の分類が重なります。同じ Python でも「高水準 + インタプリタ型 + スクリプト言語」のように 3 つすべてに該当します。
| 分類 | 特徴 | 代表例 |
|---|---|---|
| **[[低水準言語 | ていすいじゅんげんご]]** | 機械語に近い。ハードウェアを直接制御 |
| **[[高水準言語 | こうすいじゅんげんご]]** | 人間に近い。書きやすい |
| コンパイラ型 | 実行前に**機械語へ一括変換**(コンパイル)。実行時は速い | C、C++、Java |
| インタプリタ型 | 逐次解釈しながら実行。開発が速いが実行は遅め | Python、JavaScript、Ruby |
| **[[スクリプト言語 | スクリプトげんご]]** | 簡易記述・実行時解釈 |
引っかけ: Java はコンパイラ型だがバイトコードにコンパイルされて、**JVM 上で実行**されるため厳密には「コンパイラ + インタプリタ」のハイブリッド。試験で「Java はコンパイラ型」と問われたら正解、「インタプリタ型」とだけ問われたら誤り。
各言語には**得意な分野があり、そのため複数の言語が共存しています。AI/機械学習なら Python、Web フロントエンドなら JavaScript、大規模業務システムなら Java**、のように用途で選びます。試験では**言語 → 用途**の対応が頻出です。
| 言語 | 主な用途 | 特徴 |
|---|---|---|
| Python | AI・機械学習・データ分析 | 科学計算ライブラリが豊富 |
| JavaScript | Web フロントエンド・Node.js | ブラウザで動く唯一の言語 |
| Java | 業務システム・Android | JVM でプラットフォーム非依存 |
| C / C++ | OS・組込み・高速処理 | ハードウェアに近く高速 |
| Ruby | Web 開発(Ruby on Rails) | 記述が簡潔 |
| Go / Rust | サーバ・システム | 近年人気、高速・並列処理 |
| Swift / Kotlin | iOS / Android | 各プラットフォームの主流 |
| SQL | データベース操作 | 宣言型、専用領域 |
| R | 統計解析 | 学術・研究向け |
どんなプログラム言語でも、3 つの基本構造の組み合わせで処理を記述できます。これは 1966 年にベーム・ヤコピーニによって数学的に証明された事実で、構造化プログラミングの基礎となっています。
具体例: 「テストの点数によって評価を付ける」プログラムは**順次 + 分岐で書ける。「全生徒の点数を集計する」は順次 + 反復で書ける。「生徒ごとに点数を見て評価を付け、集計」は順次 + 分岐 + 反復**の組み合わせ。
変数は値を入れる名前付きの箱、データ型は箱に入れられる値の種類を決めるルール。整数と文字列を混ぜて計算できないのは、データ型が異なるから。現代の言語では型を自動判定するものもある(Python・JavaScript)が、明示的に型を書く言語(Java・C++・TypeScript)の方がバグが減る傾向にあります。
IT パスポート試験では、特定の言語に依存しない「擬似コード」でアルゴリズムが問われます。Python や Java を知らなくても読めるように、共通の記法で書かれた"疑似言語"を読み解く能力が必要です。毎年必ず出題される領域で、変数の動きを紙に書いてトレースするのが合格の鉄則です。
擬似言語の構文は**代入・分岐・反復の 3 要素が中心。日本語交じりで書かれることも多く、自然言語に近い記述**でアルゴリズムの本質を問います。
| 構文 | 意味 | 備考 |
|---|---|---|
変数 ← 式 | 代入(右辺を左辺に入れる) | = ではなく ← を使う |
if (条件) 〜 endif | 分岐 | else / elseif もある |
while (条件) 〜 endwhile | 前判定反復(条件チェック → 実行) | 最初から条件偽なら一度も実行されない |
do 〜 while (条件) | 後判定反復(実行 → 条件チェック) | 少なくとも 1 回は実行される |
for 〜 endfor | 計数反復(指定回数繰り返し) | i=1,2,...,n のような |
// コメント | 注釈 | プログラムの動作に影響なし |
引っかけ: **while(前判定)と do-while(後判定)**は初期条件が偽の時の動作が違う。while は一度も実行されない可能性がある、do-while は最低 1 回は実行される。試験で「少なくとも 1 回実行される反復構文」と問われたら do-while。
**関数は「入力 → 処理 → 出力」の一連の手続きを名前付きでパッケージ化**したもの。同じ処理を何度も使い回せるようにするため、現代プログラミングでは必須の考え方。引数を渡して呼び出し、戻り値を受け取ります。
function 加算(a, b):
return a + b
// 呼び出し
結果 ← 加算(3, 5) // 結果 = 8
具体的な値(例: 配列 [3, 1, 4, 1, 5])を入れて机上実行(トレース)するのが確実。
マークアップ言語は「文章に意味を付ける」ための言語。HTML で <h1> とタグを付けると「これは大見出し」と意味が明示されます。プログラム言語との違いは、計算やロジックを書かない点。データの**構造**を記述するのが主な用途です。試験では HTML・XML・JSON・CSV の使い分けが頻出します。
| 言語 | 用途 | 特徴 |
|---|---|---|
| HTML | Web ページの**構造**記述 | ブラウザが解釈して表示 |
| CSS | Web の**見た目**を装飾 | 正確にはマークアップではないが関連技術 |
| XML | 汎用データ記述 | 厳密な構造、業務システムで採用 |
| Markdown | 軽量マークアップ(GitHub・ドキュメント用) | 可読性が高い |
| SGML | HTML・XML の**共通祖先**(1986 年 ISO 標準) | 現代では直接使わない |
プログラム間でデータを受け渡すためのフォーマット。Web API(Web サービス間の通信)では JSON が事実上の標準。設定ファイルには YAML、**表計算との連携には CSV、業務システム間**では XML が使われます。
| 形式 | 特徴 | 用途 |
|---|---|---|
| JSON(JavaScript Object Notation) | 軽量で Web API の標準 | REST API、NoSQL、アプリ設定 |
| XML | タグ構造で複雑なデータを表現可能 | SOAP API、業務システム連携 |
| YAML | 設定ファイルで人間可読性重視 | Docker Compose、Kubernetes、CI/CD 設定 |
| CSV | カンマ区切り。表計算で扱いやすい | Excel 連携、ログ、データエクスポート |
頻出: Web API = JSON、表計算連携 = CSV、設定ファイル = YAML、業務システム連携 = XML の対応を覚える。特に JSON の軽量さと XML の厳密さの比較が頻出。
{
"name": "山田太郎",
"age": 30,
"hobbies": ["読書", "プログラミング"]
}<!DOCTYPE html>
<html>
<head>
<title>ページタイトル</title>
</head>
<body>
<h1>見出し</h1>
<p>段落テキスト</p>
</body>
</html>