本文へ移動

基本情報技術者試験 · 学習ガイド

基礎理論とアルゴリズム

2進数や論理演算、データ構造、疑似言語の読解を土台に、確率と誤差、整列・再帰の計算量まで学びます。途中の値を自分で追って結果を確かめます。

仕組みを理解する

基礎理論

基礎理論とは、2進数や論理演算など、コンピュータがデータをどう表し、計算するかの土台となる考え方です。

エルくんが説明する図解。5のビット列→全反転→1加算→−5の3段階。
考え方の例:8ビットの2の補数で−5を作るとき、5の00000101を反転し11111010、さらに1を足して11111011にします。

符号付き整数の計算では、同じビット列でも解釈が変わります。まずビット幅と符号の表現方法を固定して考えます。

基本の仕組み

基本の仕組みの図解。上から「5の00000101」「反転した11111010」「−5の11111011」を縦に並べ、下向き矢印にそれぞれ「反転」「+1」を添える。3段は仕切らず、一本の手順としてつなぐ。
覚えること:8ビットの5を反転し1を足して−5

8ビットの2の補数で−5を作るとき、5の00000101を反転し11111010、さらに1を足して11111011にします。

nビットの2の補数は−2のn−1乗から2のn−1乗−1までを表します。8ビットでは−128から127です。論理演算は各ビットの真偽で扱い、数値の加算とは区別します。

最上位が1だからといって、すべての表現で負数になるわけではありません。符号なし整数なら11111011は251です。

NANDはANDの結果を反転します。入力が00・01・10・11の順なら、ANDの出力は0・0・0・1、NANDは1・1・1・0です。XORは二つの入力が異なるとき1になります。論理式は入力の全組合せを表にして、同じ結果になるかを確認できます。

数の表現と論理の全体像

数の表現と論理の全体像の図解。上部に1本の8ビット列を置き、中央の切替器から上下2方向へ矢印を分ける。上段は「符号なし」の8ビットの範囲、下段は「2の補数」の8ビットの範囲として枠で仕切り、同じビット列でも解釈を先に選ぶことを示す。
覚えること:計算前に符号の扱いを決める

符号なしnビットは0〜2^n−1、2の補数は−2^(n−1)〜2^(n−1)−1を表します。同じビット列でも、符号付きか符号なしかを先に決めてから計算します。

基数変換では各桁の重みを使います。2進数1011.1は8+2+1+0.5=11.5です。16進数へは2進数を4桁ずつ、8進数へは3桁ずつ区切って対応させます(11111011は16進数でFB)。10進数の0.1のように、2進数では有限の桁で表せない小数もあります。

2進数を左へ1ビットシフトすると2倍、右へ1ビットシフトすると1/2(端数は小さい方へ丸め)になります。論理シフトは空いたビットに0を入れ、算術シフトは符号ビットを保ち、右シフトでは空いた上位ビットに符号と同じ値を入れます。

NOTは入力を反転し、NORはORの結果を反転します。AND、OR、XOR、NAND、NORの出力は、次の表のように入力の全組合せで比較します。

数の表現と論理の全体像
表現8ビットの範囲
符号なし0〜255
2の補数−128〜127
数の表現と論理の全体像
入力A・BANDORXORNANDNOR
0・000011
0・101110
1・001110
1・111000

試験に出る

  • 2進数と10進数の相互変換。各桁の重みを足して求める計算。
  • 2進数と16進数は4桁ずつ対応させる変換と、1ビットの左シフトで2倍・右シフトで1/2になる関係。
  • 8ビットの2の補数が表す範囲(−128〜127)と、5の反転+1で−5を作る手順。
  • NAND・XORの真理値。NANDはANDの反転、XORは入力が異なるとき1。
  • 符号付きと符号なしで同じビット列の意味が変わる点(11111011は−5か251か)。
  • 桁あふれを捨てて計算する例(5+(−5)=0)。

重要な言葉

2の補数
負の整数を表す表現方法。ビットを反転して1を足す。
論理演算
0と1の真偽を組み合わせて結果を求める演算。ANDやORなど。
NAND
ANDの結果を反転した論理演算。
桁あふれ
計算結果が表せるビット幅を超えること。

確認問題

確かめよう8ビットの2の補数で00000101と11111011を足すと?

桁あふれを捨てて00000000です。

8ビットの2の補数で5と−5を足すと、桁あふれを捨てて0になる。

XORは、二つの入力が同じときに1になる。

8ビットの2の補数で−5を表すビット列は?

NANDの出力が0になるのはどの入力のとき?

の計算では、同じビット列でも解釈が変わります。まずと符号の表現方法を固定して考えます。

8ビットので−5を作るとき、5の00000101を反転し11111010、さらに1を足してにします。

nビットの2の補数は−2のn−1乗から2のn−1乗−1までを表します。8ビットではから127です。は各ビットの真偽で扱い、数値の加算とは区別します。

が1だからといって、すべての表現で負数になるわけではありません。符号なし整数なら11111011はです。

はANDの結果を反転します。入力が00・01・10・11の順なら、ANDの出力は0・0・0・1、NANDは1・1・1・0です。は二つの入力が異なるとき1になります。論理式は入力の全組合せを表にして、同じ結果になるかを確認できます。

データ構造

データ構造とは、データの並べ方と取り出し方の違いを表す型で、用途に合う構造を選ぶことで処理しやすくなります。

エルくんが説明する図解。A/B/Cを入れた縦積みと横の行列、取り出し順CBAとABCを明示。
A、B、Cの順に入れると、スタックはC、B、Aの順、キューはA、B、Cの順で取り出します。前者は後入れ先出し、後者は先入れ先出しです。

データをどの順番で取り出すかによって、適した構造が変わります。皿の積み重ねと受付の列を比べてみましょう。

基本の仕組み

基本の仕組みの図解。直前要素を左、従来の次要素を右、新要素を下に置く。エルくんが新要素から右への参照を先につなぐ場面を描き、直前要素から新要素への参照変更は「②」の点線矢印で示す。
覚えること:途中挿入は新→次、次に直前→新

A、B、Cの順に入れると、スタックはC、B、Aの順、キューはA、B、Cの順で取り出します。前者は後入れ先出し、後者は先入れ先出しです。

配列は添字で直接要素を参照しやすく、連結リストは次の要素への参照をたどります。木は親子関係を持ち、根から枝を選んで要素を探せます。

連結リストの途中への挿入が容易でも、挿入位置を探すコストが消えるわけではありません。操作の前提と全体の処理量を分けて考えます。

単方向リストは、各要素が次の要素への参照を持つ連結リストです。途中へ要素を挿入するには、新要素を従来の次要素へつなぎ、直前要素の参照を新要素へ変更します。先に参照を上書きして後続への道を失わないよう、更新順を追います。

構造を選ぶ条件

構造を選ぶ条件の図解。中央に連結リストの要素を左から右へ並べ、挿入位置までたどる経路を点線矢印で示す。その位置に新しい要素を置き、前後の要素との参照を実線矢印でつなぐ。
覚えること:挿入位置を走査し、参照を付替える

配列は添字による直接参照に向きます。連結リストは参照の付替えで挿入できますが、挿入位置を探す走査は必要です。スタックは後入れ先出し、キューは先入れ先出しで要素を取り出します。

木は親子関係を表す構造です。2分探索木は「左の子孫<節<右の子孫」となるよう値を置き、根から大小比較で左右へ進んで探します。ヒープは親が子以上(または以下)となる完全2分木で、最大値(最小値)を根から取り出せます。ハッシュ表はキーから計算した位置へ格納します。

構造を選ぶ条件
構造代表的な操作・性質
スタックpush・pop(後入れ先出し)
キューenqueue・dequeue(先入れ先出し)
連結リスト参照をたどる・付け替える
2分探索木左<節<右の大小で探索
ヒープ親が子以上(以下)で根が最大(最小)
ハッシュ表キーから格納位置を計算

試験に出る

  • スタック(後入れ先出し)とキュー(先入れ先出し)の取り出し順。
  • 配列は添字で直接参照、連結リストは次の要素をたどるという違い。
  • 単方向リストの挿入で参照を付け替える順序と、走査の手順。
  • 挿入が容易でも挿入位置を探すコストは残ること。
  • Undoなど用途からスタックかキューかを選ぶ判断。

重要な言葉

スタック
最後に入れたものを最初に取り出す後入れ先出しの構造。
キュー
最初に入れたものを最初に取り出す先入れ先出しの構造。
連結リスト
各要素が次の要素への参照を持ち、順にたどる構造。
単方向リスト
次の要素への参照だけを持つ連結リスト。

確認問題

確かめようUndoで直前の操作から戻すならどちら?

スタック。最後に行った操作を先に取り出します。

スタックは、先に入れた要素を先に取り出す。

単方向リストは、次の要素への参照だけを持つ。

最後に入れた要素を最初に取り出す構造は?

各要素が次の要素への参照だけを持つ構造は?

データをどの順番で取り出すかによって、適した構造が変わります。とを比べてみましょう。

A、B、Cの順に入れると、はC、B、Aの順、はA、B、Cの順で取り出します。前者は後入れ先出し、後者は先入れ先出しです。

は添字で直接要素を参照しやすく、は次の要素への参照をたどります。木は親子関係を持ち、根から枝を選んで要素を探せます。

の途中への挿入が容易でも、挿入位置を探すコストが消えるわけではありません。操作の前提と全体のを分けて考えます。

は、各要素が次の要素へのを持つ連結リストです。途中へ要素を挿入するには、新要素を従来の次要素へつなぎ、直前要素の参照を新要素へ変更します。先に参照を上書きして後続への道を失わないよう、更新順を追います。

アルゴリズム

アルゴリズムとは、問題を解くための手順であり、整列の有無など前提によって適した方法が変わります。

エルくんが説明する図解。7個の整列数から7を比較し右3個へ絞り11に到達する図。
考え方の例:1、3、5、7、9、11、13から11を探すと、中央7より大きいので右半分へ進み、9、11、13の中央11で一致します。

大量の番号から目的の番号を探すとき、毎回すべてを読む必要があるでしょうか。整列済みなら、中央との比較で候補を半分にできます。

基本の仕組み

基本の仕組みの図解。整列した「1、3、5、7、9、11、13」を横一列に置き、中央の7と探す値11を比較する。7より大きいので左側を薄くし、右半分の9・11・13を枠で囲み、その中央の11へ矢印をつないで一致を示す。
覚えること:整列時、中央より大なら右半分へ

1、3、5、7、9、11、13から11を探すと、中央7より大きいので右半分へ進み、9、11、13の中央11で一致します。

二分探索は整列を前提とし、比較のたびに下限または上限を更新します。候補を約半分にするため、探索の比較回数は要素数nに対しておおむねlog₂nの規模です。最大比較回数は⌊log₂n⌋+1回(⌊ ⌋は小数点以下切捨て)で、16個なら5回です。

未整列の配列では、中央より大きい値が左にもあるため半分を捨てられません。添字の更新を誤ると同じ範囲を繰り返して終了しない場合があります。

探索方法の前提

探索方法の前提の図解。中央に小さい順に並ぶ項目列を置き、その上に候補範囲を示す枠を描く。エルくんが下限を右へ動かす前の位置を点線、動かした後を実線で示し、上限は固定して候補範囲が縮む様子を一つの列で表す。
覚えること:二分探索は整列済みで、範囲縮小を確認

線形探索は未整列でも使えます。n個から探すと比較回数は最悪n回、見つかる場合の平均は(n+1)/2回で、計算量はO(n)です。二分探索は整列済みを前提にO(log n)です。二分探索では、下限・上限の更新後も候補範囲が必ず縮むかを確かめます。

ハッシュ探索は、キーから計算した位置(ハッシュ値)を直接調べます。異なるキーが同じ位置になる衝突が少なければ平均O(1)ですが、衝突が多いと比較回数が増えます。

探索方法の前提
探索必要な前提比較回数の目安
線形整列不要平均(n+1)/2回、最悪n回
二分整列済み最大⌊log₂n⌋+1回
ハッシュキーの変換と衝突処理衝突がなければ1回

試験に出る

  • 二分探索は整列済みが前提という条件。
  • 比較のたびに下限・上限を更新し、候補が約半分になること。
  • 探索の比較回数が要素数nに対しておおむねlog₂n、最大は⌊log₂n⌋+1回であること。線形探索の平均(n+1)/2回との比較。
  • 未整列では中央で半分を捨てられないこと。
  • 添字更新を誤ると終了しない場合があること。

重要な言葉

二分探索
整列済みのデータで中央と比較し、候補を半分に絞る探索。
計算量
処理に必要な手間を要素数との関係で表した量。
線形探索
先頭から順に比較して目的の値を探す方法。

確認問題

確かめよう候補が16個なら、半分に4回絞ると何個?

1個。16→8→4→2→1です。

二分探索は、データが未整列でも使える。

候補が16個のとき、半分に絞る操作を4回行うと1個になる。

二分探索が前提とする条件は?

候補16個を半分に絞る操作を繰り返すと、1個になるまで何回?

大量の番号から目的の番号を探すとき、毎回すべてを読む必要があるでしょうか。なら、中央との比較で候補をにできます。

1、3、5、7、9、11、13から11を探すと、より大きいのでへ進み、9、11、13の中央11で一致します。

は整列を前提とし、比較のたびに下限または上限を更新します。候補を約半分にするため、探索の比較回数は要素数nに対しておおむねの規模です。最大比較回数は⌊log₂n⌋+1回(⌊ ⌋は小数点以下切捨て)で、16個なら5回です。

の配列では、中央より大きい値が左にもあるため半分を捨てられません。の更新を誤ると同じ範囲を繰り返して終了しない場合があります。

疑似言語と科目B読解

疑似言語とは、プログラムの処理を日本語に近い形で表した記述で、変数の値を一行ずつ追って読解します。IPAの試験では「擬似言語」と表記します。

エルくんが説明する図解。i=1,2,3に対しs更新前0,1,3と更新後1,3,6を並べた表。
考え方の例:s=0として、iを1から3まで変化させs=s+iを実行すると、sは1、3、6です。更新前と更新後を分けた表を作ると、何が累積されたか分かります。

コードを眺めて答えを予想するより、変数の値を一行ずつ追うと確実です。疑似言語では問題ごとの添字や範囲の約束も読みます。

基本の仕組み

基本の仕組みの図解。中央に3行の表を置き、「i|更新前|+i|更新後」を縦線で仕切る。各行に「1|0|+1|1」「2|1|+2|3」「3|3|+3|6」と記し、各行の更新後から次の行の更新前へ下向き矢印を引く。
覚えること:s=0から1〜3を順に足すと6

s ← 0として、iを1から3まで1ずつ増やしながらs ← s+iを実行すると、sは1、3、6と変わります。更新前と更新後を分けた表を作ると、何が累積されたか分かります。

条件分岐は条件を評価した時点の値で進む先が決まり、反復では終了条件を再評価します。配列の走査では、添字(要素番号)がどこからどこまで動くかを先に確認します。

科目Bの問題文では「配列の要素番号は1から始まる」と注記されるのが通例です。一般的なプログラミング言語の0始まりと混同すると、参照する要素が一つずれます。また、ループの外で初期化する変数と毎回初期化する変数では結果が変わります。

科目Bの追跡手順

科目Bの追跡手順の図解。中央の仕切りで左右を分け、左はwhileの「条件:偽」から処理を通らず出口へ、右はdo〜whileの処理を1回通ってから「条件:偽」を経て出口へ進む矢印を描く。両側とも条件が最初に偽になる場合を比較する。
覚えること:初回偽なら前判定0回・後判定1回

IPAの擬似言語の記述形式では、代入を「変数名 ← 式」、剰余算をmodで書きます。選択はif〜elseif〜else〜endifで、条件式を上から評価し、最初に真になった処理だけを実行します。値が格納されていない状態は「未定義」と呼びます。

繰返しのwhileは前判定で、条件が最初から偽なら一度も実行しません。do〜whileは後判定で、処理を必ず1回は実行します。forは制御記述(例:iを1からnまで1ずつ増やす)に従って繰り返します。

演算子の優先順位は、単項のnot・+・−が最も高く、乗除(mod・×・÷)、加減、関係演算子(≠・≦・=など)、and、orの順に低くなります。「a or b and c」は「a or (b and c)」と読みます。

読解では、変数の型、要素番号の開始、引数と戻り値を問題文で確認します。分岐の真偽と反復の各回で変わる値を表にし、境界値と終了条件を追います。最大値を判定する条件なら、候補が他の全ての値以上であることを確かめる必要があります。

科目Bの追跡手順
確認点誤読しやすい点
要素番号1始まりか(問題文の注記)と末尾
選択elseifは最初に真になった処理だけ実行
反復前判定か後判定か、更新と終了判定の順序
演算子andはorより先に評価
引数・戻り値呼出し元の値が変わるか、何を返すか

試験に出る

  • 変数の値を一行ずつ追って表にするトレース。
  • ループの初期化を外に置くか毎回行うかで結果が変わる点。
  • 科目Bの配列は問題文の注記どおり要素番号1から始まる点(0始まりと混同しない)。
  • 代入の←、剰余のmod、andがorより先に評価される優先順位など、擬似言語の記述形式。
  • 条件分岐は評価時点の値、反復は終了条件を再評価する点。whileは前判定、do〜whileは後判定。
  • 累積の有無で最終値が変わる計算例。

重要な言葉

疑似言語
処理の流れを日本語に近い形で表した記述。
トレース
変数の値を一行ずつ追って処理結果を確かめること。
ループ
条件が成り立つ間、同じ処理を繰り返す構造。

確認問題

確かめよう各反復の初めにs ← 0で戻したら最終値は?

3。合計が蓄積されなくなるためです。

ループの中で毎回変数を初期化すると、値が累積されない。

0始まりの配列と1始まりの配列を混同しても結果は同じ。

処理の値を一行ずつ追って確かめることを何という?

合計用の変数をループの中で毎回0に戻すと、合計はどうなる?

コードを眺めて答えを予想するより、を一行ずつ追うと確実です。では問題ごとの添字や範囲の約束も読みます。

s ← 0として、iを1から3まで1ずつ増やしながらを実行すると、sは1、3、6と変わります。更新前と更新後を分けた表を作ると、何がされたか分かります。

は条件を評価した時点の値で進む先が決まり、反復ではを再評価します。配列の走査では、添字(要素番号)がどこからどこまで動くかを先に確認します。

科目Bの問題文では「配列の要素番号は1から始まる」と注記されるのが通例です。一般的なプログラミング言語のと混同すると、参照する要素が一つずれます。また、の外で初期化する変数と毎回初期化する変数では結果が変わります。

確率・統計と数値誤差

確率・統計とは、でたらめな事象やデータの傾向を数値で捉える方法で、計算には有限桁による誤差も伴います。

エルくんが100円札カード3枚と0円カード7枚を10個の同じ枠へ並べ、合計300円を10等分した平均30円の帯を引き出す図。
考え方の例:100円の確率0.3、0円の確率0.7を、100円3枚と0円7枚の10枠で表しています。重み付け平均は100×0.3+0×0.7=30円。一回の結果は100円か0円で、必ず30円を受け取る意味ではありません。

データから判断するときは、平均だけでなく散らばりや偶然の影響を考えます。コンピュータの計算にも、有限の桁数で表すことによる誤差があります。

基本の仕組み

基本の仕組みの図解。上部に「100円・確率0.3」と「0円・確率0.7」の結果カードを左右に配置する。両カードからの矢印を中央の式「100×0.3+0×0.7=30円」に集め、その下に「期待値30円」を置く。
覚えること:期待値30円でも毎回30円ではない

100円を受け取る確率が0.3、0円が0.7なら期待値は100×0.3+0×0.7=30円です。これは一回必ず30円になるという意味ではなく、結果を確率で重み付けした値です。

分散は平均からのずれを二乗して平均した量で、標準偏差はその平方根です。例えば2、4、6の平均は4、分散は{(−2)²+0²+2²}÷3=8/3、標準偏差は約1.63です。

標本から母集団を推測するときは、抽出の偏りと標本数を確認します。独立な二事象が両方起こる確率は積になりますが、独立でない場合にそのまま掛けてはいけません。

丸め誤差は表現できる桁に切り詰めることで生じ、桁落ちは近い値の差を取って有効な桁が減る現象です。発生確率pの情報量は−log₂pビットで、珍しい事象ほど大きくなります。これらを単なるプログラムの誤記と混同しないようにします。

確率・誤差の判別

確率・誤差の判別の図解。中央に絶対値の異なる数カードを左から小さい順に並べ、カード間に「+」、列の上に右向きの矢印を置く。下部を仕切り、情報落ちを減らすための加算順序を結論として示す。
覚えること:情報落ち軽減は絶対値の小さい順に加算

独立な事象がともに起こる確率は積、排反な(同時には起こらない)事象のいずれかが起こる確率は和です。

浮動小数点数の丸め誤差、打切り誤差、桁落ち、情報落ち、オーバーフローは発生の仕方が異なります。情報落ちを減らすには、絶対値の小さい数から順に加えます。有効桁数を超えた結果を無条件に正確とみなしません。

確率・誤差の判別
誤差生じる場面
丸め誤差表現できる桁へ丸める
打切り誤差無限に続く計算を途中で打ち切る
桁落ち値がほぼ等しい数どうしの減算
情報落ち絶対値の大きい数へ小さい数を加減する
オーバーフロー表現できる範囲を超える

試験に出る

  • 期待値は結果を確率で重み付けした値で、1回の結果と一致しないこと。
  • 分散は平均からのずれの二乗平均、標準偏差はその平方根。
  • 丸め誤差と桁落ちの違いと発生原因。
  • 情報量は−log₂pビットで、珍しい事象ほど大きいこと。
  • 独立でない事象の同時確率を単純に掛けてはいけない点。

重要な言葉

期待値
結果を確率で重み付けして足し合わせた平均的な値。
標準偏差
分散の平方根で、データの散らばりの大きさを表す。
丸め誤差
表現できる桁に切り詰めることで生じる誤差。
桁落ち
近い値の差を取って有効な桁が減る現象。

確認問題

確かめよう同じ平均の二つのデータでもばらつきは同じ?

いいえ。標準偏差などを併せて見ます。確率1/8の事象の情報量は3ビットです。

期待値は、1回の試行で必ずその値になる。

珍しい事象ほど情報量は大きい。

確率0.3で100円、0.7で0円の期待値は?

近い値の差を取って有効な桁が減る現象は?

データから判断するときは、平均だけでなくや偶然の影響を考えます。コンピュータの計算にも、有限の桁数で表すことによるがあります。

100円を受け取る確率が0.3、0円が0.7ならは100×0.3+0×0.7=です。これは一回必ず30円になるという意味ではなく、結果を確率で重み付けした値です。

分散は平均からのずれを二乗して平均した量で、はその平方根です。例えば2、4、6の平均は4、分散は{(−2)²+0²+2²}÷3=8/3、標準偏差は約1.63です。

標本から母集団を推測するときは、抽出の偏りと標本数を確認します。な二事象が両方起こる確率は積になりますが、独立でない場合にそのまま掛けてはいけません。

は表現できる桁に切り詰めることで生じ、は近い値の差を取って有効な桁が減る現象です。発生確率pの情報量は−log₂pビットで、珍しい事象ほど大きくなります。これらを単なるプログラムの誤記と混同しないようにします。

整列・再帰と計算量

整列とは、データを決まった順に並べ替える処理で、再帰や分割の仕方によって計算量が変わります。

エルくんが基準4の仕切りを置き、数値タイル2を左、6と8を右へ仕分ける図。
考え方の例:基準値4の前後へ値を分けます。一般には分けた部分にも同じ処理を繰り返します。図はこの入力例の分割を示します。

探索の前にデータを整列すると検索しやすくなりますが、整列自体にも処理時間が必要です。交換や分割の手順から、使うメモリと比較回数を考えます。

基本の仕組み

基本の仕組みの図解。上に元の並び「6、2、8、4」を置き、中央の「4」を基準に縦の仕切りを設ける。矢印で左の小さい側「2」、右の大きい側「6、8」へ分け、下で結んだ結果「2、4、6、8」へつなぐ。
覚えること:基準値で分け、各側を整列して結ぶ

6、2、8、4を4を基準に分けると、小さい側は2、大きい側は6、8です。それぞれをさらに整列して結ぶと2、4、6、8になります。このように基準値で分割するのがクイックソートの考え方です。

クイックソートは平均的にはO(n log n)ですが、分割が極端に偏るとO(n²)になります。マージソートは部分列を整列して併合し、一般的な配列実装では作業領域を使います。バブルソートは隣接要素を比較・交換するため、多数の比較が必要です。

再帰は自分と同じ処理を小さい問題へ適用する方法です。階乗ならf(0)=1を終了条件にf(n)=n×f(n−1)とします。終了条件だけでなく、そこへ近づく引数の更新が必要で、呼出しの情報はスタックへ積まれます。

整列・再帰の費用

整列・再帰の費用の図解。上段にクイックソートの「平均O(n log n)」を置き、中央には一列の要素を配置する。中央の列を端寄りで分けた偏った分割から、下段の「最悪O(n²)」へ下向き矢印を引き、上段と中央を細線で仕切る。
覚えること:クイックは分割が偏ると最悪O(n²)

バブル・選択・挿入ソートは基本形の最悪計算量がO(n²)です。マージソートはO(n log n)で補助領域を使い、ヒープソートもO(n log n)です。クイックソートは平均O(n log n)でも、分割が偏ると最悪O(n²)です。再帰は停止条件と呼出しごとの状態を確認します。

整列・再帰の費用
方法計算量の目安
バブル・選択・挿入最悪O(n²)
マージO(n log n)
ヒープO(n log n)
クイック平均O(n log n)、最悪O(n²)

試験に出る

  • クイックソートは平均O(n log n)だが分割が偏るとO(n²)。
  • マージソートは併合で整列し、配列実装では作業領域を使う点。
  • バブルソートは隣接比較・交換で比較回数が多いこと。
  • 再帰は終了条件と、そこへ近づく引数の更新の両方が必要。
  • 再帰呼出しの情報がスタックに積まれること。

重要な言葉

クイックソート
基準値で分割しながら整列する方法。
マージソート
部分列を整列して併合する方法。
再帰呼出し
自分と同じ処理をより小さい問題へ呼び出すこと。
計算量
処理に必要な手間を要素数との関係で表した量。

確認問題

確かめようクイックソートはどんな入力でもO(n log n)?

いいえ。分割の偏りによる最悪の場合と、平均的な場合を分けます。

クイックソートは、どの入力でも必ずO(n log n)である。

再帰には終了条件と、そこへ近づく引数の更新が必要。

分割が極端に偏るとO(n²)になる整列法は?

再帰呼出しの情報が積まれる場所は?

探索の前にデータを整列すると検索しやすくなりますが、整列自体にもが必要です。交換や分割の手順から、使うメモリとを考えます。

6、2、8、4を4を基準に分けると、小さい側は2、大きい側は6、8です。それぞれをさらに整列して結ぶと2、4、6、8になります。このようにで分割するのがの考え方です。

クイックソートは平均的にはO(n log n)ですが、分割が極端に偏るとO(n²)になります。は部分列を整列して併合し、一般的な配列実装では作業領域を使います。は隣接要素を比較・交換するため、多数の比較が必要です。

は自分と同じ処理を小さい問題へ適用する方法です。階乗ならf(0)=1をにf(n)=n×f(n−1)とします。終了条件だけでなく、そこへ近づく引数の更新が必要で、呼出しの情報はスタックへ積まれます。

単方向リストを配列でたどる

単方向リストとは、各要素が次の要素への参照だけを持つ構造で、配列の添字とは別に参照をたどります。

dataとnextの表を示し、エルくんが3:Cから2:Bへの参照矢印をつなぐ図。
添字1からnextをたどると1→3→2→終了、データはA→C→Bの順です。格納順とたどる順の違いを表します。

配列の添字順と、データを読む順番は同じとは限りません。単方向リストは、現在の要素が持つ「次の要素への参照」を頼りに進む構造です。

基本の仕組み

基本の仕組みの図解。中央に添字1・2・3の配列を横並びに置き、それぞれA・B・Cを入れる。先頭の1から、nextの矢印を1→3→2→nullの順につなぎ、読む順A→C→Bが分かるようにする。
覚えること:読んでnextへ、nullなら停止

1始まりの例で、data[1]=A、data[2]=B、data[3]=C、next[1]=3、next[3]=2、next[2]=null、先頭が1なら、読む順はA→C→Bです。添字を1ずつ増やすのではなく、1→3→2とnextをたどります。

現在位置pのデータを読み、その後でp=next[p]へ更新します。pが終了を表す値になれば止めます。終了値が未定義(null)か0か、添字が0始まりか1始まりかは設問の定義に従い、終了値を配列の添字として参照しないようにします。

途中へ要素を挿入するときは参照の付け替えが必要です。ただし、走査の問題では挿入処理を勝手に追加しません。各反復の「更新前のp」「読んだdata[p]」「次のp」を表にすると、データ値と添字を混同しにくくなります。

配列によるリスト表現

配列によるリスト表現の図解。1枚の図に、直前要素を左上、新要素を下、旧後続を右上の配列枠として離して置く。直前要素から旧後続への元のnextは細い破線で示し、①新要素から旧後続へnextをつなぎ、②直前要素のnextを新要素へ付け替える順を番号付き矢印で示す。
覚えること:新nextを旧後続へ→直前nextを新へ

配列で単方向リストを表すときは、各要素の値だけでなく次要素の添字を保持します。先頭添字からnextをたどり、終端値で止めます。挿入では新要素のnextを旧後続へ設定してから、直前要素のnextを新要素へ変えます。

配列によるリスト表現
操作更新する参照
走査現在位置から次位置へ
途中挿入新要素と直前要素のnext
削除直前要素のnext

試験に出る

  • 配列の添字順ではなくnextをたどる読み順。
  • data[p]を読んでからp=next[p]へ更新する順序。
  • 終了値を配列の添字として参照しないこと。
  • 0始まりか1始まりかを設問の定義で確認すること。
  • データ値と添字、更新前と更新後のpを混同しないこと。

重要な言葉

単方向リスト
各要素が次の要素への参照だけを持つ構造。
添字
配列の要素を指定する番号。
終了値
走査の終わりを表す値。nullや0など設問の定義による。
走査
要素を順にたどって調べること。

確認問題

確かめようこの例でAを読んだ次にdata[2]を読む?

いいえ。next[1]=3なので、次はdata[3]のCです。

単方向リストは、配列の添字を1ずつ増やして読む。

終了を表す値を、配列の添字として参照してよい。

data[1]=A、next[1]=3のとき、Aの次に読むのは?

単方向リストの走査でpを更新する正しい順序は?

配列の添字順と、データを読む順番は同じとは限りません。は、現在の要素が持つ「次の要素への」を頼りに進む構造です。

1始まりの例で、data[1]=A、data[2]=B、data[3]=C、[1]=3、next[3]=2、next[2]=null、先頭が1なら、読む順はです。添字を1ずつ増やすのではなく、1→3→2とnextをたどります。

のデータを読み、その後でp=next[p]へ更新します。pが終了を表す値になれば止めます。終了値が未定義(null)か0か、添字が0始まりか1始まりかは設問の定義に従い、を配列の添字として参照しないようにします。

途中へ要素を挿入するときはが必要です。ただし、走査の問題では挿入処理を勝手に追加しません。各反復の「」「読んだdata[p]」「次のp」を表にすると、データ値と添字を混同しにくくなります。

AND・ORと真理値表の逆算

AND・ORとは、二つ以上の条件を組み合わせる論理演算で、真理値表を使えば入力や出力を逆算できます。

入力00・01・10・11に対するANDとORの出力を比較し、エルくんが出力タイルを表にはめる図。
ANDは両方の入力が1、ORは少なくとも一方が1のときに出力が1です。出力だけでは入力が一通りに決まらない場合があります。

二つの条件の両方が必要なのか、どちらか一つでよいのかで結果が変わります。論理演算では、まず0と1の全組合せを表にして確かめます。

基本の仕組み

基本の仕組みの図解。中央にA・B・ORの表を置き、上から「0・0・0」「0・1・1」「1・0・1」「1・1・1」の順に並べる。左の条件「A=0」「OR=1」から表へ矢印を引き、両方に合う2行目だけを枠で残して、右に「B=1」を示す。
覚えること:A=0かつOR=1ならB=1

入力(A,B)が(0,0)、(0,1)、(1,0)、(1,1)の順なら、ANDの出力は0、0、0、1、ORの出力は0、1、1、1です。ANDは両方が1のときだけ1、ORは少なくとも一方が1なら1になります。

出力から未知の入力を逆算する場合も、同じ表を使います。A=0でA OR B=1ならB=1です。A=1でA AND B=0ならB=0です。既知の入力と出力の両方に合う行だけを残します。

いつでも未知の値が一つに決まるわけではありません。A=0でA AND B=0なら、Bは0でも1でも成立します。また、ORを「どちらか一方だけ」と覚えると、両方が1の行を間違えます。それはXORとの混同です。

演算の比較とド・モルガンの法則

演算の比較とド・モルガンの法則の図解。中央の縦仕切りを挟み、左に「not (A and B)」、右に「(not A) or (not B)」を置き、左から右への矢印で等価な変形を示す。右側ではAとBそれぞれの前のnotと、ANDから入れ替わったORを強調する。
覚えること:否定をA・Bへ配るとANDはOR

ANDは両方真、ORは少なくとも一方が真、XORは異なるとき真、NANDはANDの否定です。論理式が等価かを確かめるときは、入力の全組合せの出力を比較します。

否定をかっこの中へ配るときは、ド・モルガンの法則でANDとORも入れ替えます。not (A and B) は (not A) or (not B)、not (A or B) は (not A) and (not B) と等しくなります。

演算の比較とド・モルガンの法則
演算1となる条件
AND両方1
OR少なくとも一方1
XOR二つが異なる
NAND両方1以外

試験に出る

  • ANDは両方1のときだけ1、ORは一方が1なら1という違い。
  • 真理値表から未知の入力を逆算する手順。
  • 出力が同じでも入力が確定しない場合があること。
  • ORを「どちらか一方だけ」と覚えるとXORと混同すること。
  • 入力と出力の両方に合う行だけを残す考え方。

重要な言葉

真理値表
入力の全組合せと出力を並べた表。
AND
両方の入力が1のときだけ1になる論理演算。
OR
少なくとも一方の入力が1なら1になる論理演算。
XOR
二つの入力が異なるとき1になる論理演算。

確認問題

確かめようA=1でA OR B=1ならBを確定できる?

できません。Bが0でも1でも出力が1になるからです。

ANDは、少なくとも一方の入力が1なら1になる。

A=0でA AND B=0のとき、Bは0でも1でも成立する。

A=0でA OR B=1のとき、Bは?

「どちらか一方だけが1のとき1」となる論理演算は?

二つの条件の両方が必要なのか、どちらか一つでよいのかで結果が変わります。では、まず0と1のを表にして確かめます。

入力(A,B)が(0,0)、(0,1)、(1,0)、(1,1)の順なら、の出力は0、0、0、1、の出力は0、1、1、1です。ANDは両方が1のときだけ1、ORは少なくとも一方が1なら1になります。

出力から未知の入力をする場合も、同じ表を使います。A=0でA OR B=1ならB=1です。A=1でA AND B=0ならB=0です。と出力の両方に合う行だけを残します。

いつでも未知の値が一つに決まるわけではありません。A=0でA AND B=0なら、Bは0でも1でも成立します。また、ORを「どちらか一方だけ」と覚えると、両方が1の行を間違えます。それはとのです。

覚えるポイント

  • 基礎理論:nビットの2の補数表現の範囲は −(2^(n−1)) から 2^(n−1)−1 です。8ビットでは−128から127です。論理演算は各ビットの真偽で扱い、数値の加算とは区別します。
  • データ構造:配列は添字で直接要素を参照しやすく、連結リストは次の要素への参照をたどります。木は親子関係を持ち、根から枝を選んで要素を探せます。
  • アルゴリズム:二分探索は整列を前提とし、比較のたびに下限または上限を更新します。候補を約半分にするため、探索の比較回数は要素数nに対しておおむねlog₂nの規模です。
  • 疑似言語と科目B読解:条件分岐は条件を評価した時点の値で進む先が決まり、反復では終了条件を再評価します。配列の走査では、添字がどこからどこまで動くかを先に確認します。
  • 確率・統計と数値誤差:分散は平均からのずれを二乗して平均した量で、標準偏差はその平方根です。標本から母集団を推測するときは、抽出の偏りと標本数を確認します。独立な二事象が両方起こる確率は積になりますが、独立でない場合にそのまま掛けてはいけません。
  • 整列・再帰と計算量:クイックソートは平均的にはO(n log n)ですが、分割が極端に偏るとO(n²)になります。マージソートは部分列を整列して併合し、一般的な配列実装では作業領域を使います。バブルソートは隣接要素を比較・交換するため、多数の比較が必要です。
  • 単方向リストを配列でたどる:単方向リストとは、各要素が次の要素への参照だけを持つ構造で、配列の添字とは別に参照をたどります。
  • AND・ORと真理値表の逆算:AND・ORとは、二つ以上の条件を組み合わせる論理演算で、真理値表を使えば入力や出力を逆算できます。

出典・参考資料

試験の公式案内と、この記事の参考にした学習資料です。

編集:Pinternet Works · 更新日:

教材の編集方針・訂正について