クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

集合の演算と包除原理

このレッスンのあとで: 集合の演算を使って、重ならないように人数や個数を数えることができる。

55分のレッスンコマンド4件コンパイラとアーキテクチャのラボ:gcc、flex、bison、RISC-V を1台の VM で

重ねて数えない数え方

集合とは、はっきり決まったものの集まりです。和集合や共通部分を使うと、「2つのサークルの、どちらかに入っている人は何人か」のような数を、重ねて数えずに求められます。

軽音楽サークルが25人、写真サークルが18人でも、合わせて43人とは限りません。両方に入っている人がいるからです。今日はその数え方を、表で学びます。

このレッスンのゴール

メモ

集合の演算を使って、重ならないように人数や個数を数えることができる。

キーワード

ことばいみ
集合入るかどうかがはっきり決まるものの集まり
要素集合に入っているもの1つ1つ
和集合A か B の少なくとも一方に入る要素の集合
共通部分A にも B にも入る要素の集合
差集合A に入って B に入らない要素の集合
包除原理合わせた数から、重なりを引いて数える決まり

学生が入力するセルは、このプレビューでは空白です。

集合は、要素の集まり

集合は、入るかどうかがはっきり決まるものの集まりです。入っている1つ1つを要素と呼び、{1, 2, 3} のように波かっこで書きます。

集合では、並べる順序は関係なく、同じ要素を2回数えません。{1, 2, 3} と {3, 2, 1} と {1, 1, 2, 3} は、すべて同じ集合です。

和集合、共通部分、差集合

2つの集合 A と B を考えます。和集合は、A か B の少なくとも一方に入る要素の集合です。共通部分は、両方に入る要素の集合です。差集合は、A に入って B に入らない要素の集合です。

言いかえると、和集合は「または」、共通部分は「かつ」です。差集合は「A に入る、かつ B に入らない」です。前回の表と同じ形をしています。

例: A={1,2,3,4}、B={3,4,5}

要素AB和集合共通部分A から B を除く
1入る入らない入る入らない入る
2入る入らない入る入らない入る
3入る入る入る入る入らない
4入る入る入る入る入らない
5入らない入る入る入らない入らない
結果{1, 2, 3, 4}{3, 4, 5}{1, 2, 3, 4, 5}{3, 4}{1, 2}

学生が入力するセルは、このプレビューでは空白です。

Python の集合で3つを計算する

コマンド
python3 -c "A = {1, 2, 3, 4}; B = {3, 4, 5}; print(sorted(A | B), sorted(A & B), sorted(A - B))"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

シェルでも集合を扱える

行を要素と考えます。2つの名簿をつなげて sort -u に渡すと、重なりを1回にした和集合になります。

sort の後ろに uniq -d をつなぐと、2回出てきた行だけが残ります。つまり両方の名簿にある行、共通部分です。ただし、各名簿に同じ名前が1回ずつしかない場合に限ります。

和集合: sort -u で重なりを消す

コマンド
printf "1\n2\n3\n4\n3\n4\n5\n" | sort -u

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

共通部分: uniq -d で重なりだけ残す

コマンド
printf "1\n2\n3\n4\n3\n4\n5\n" | sort | uniq -d

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

リストと for で和集合を作る

コード: python
# 名簿 a の全員を入れ、b からは、まだいない人だけを足します。
a = [1, 2, 3, 4]
b = [3, 4, 5]
union = []
for x in a:
    union.append(x)
for x in b:
    if x not in union:
        union.append(x)
print(union)
# if の行を消すと、3 と 4 が2回出ます。試してみましょう。

重なりを引いて数える

包除原理は、2つの集合を合わせた数を、重なりを引いて求める決まりです。(A の人数) + (B の人数) - (両方の人数) で求めます。

両方に入る人は、足すときに2回数えられています。1回分を引けば、ちょうど1回ずつになります。

例: 2つのサークルの人数

数えるもの人数
軽音楽サークル25
写真サークル18
両方に入っている7
足しただけ(まちがい)25 + 18 = 43
どちらかに入っている25 + 18 - 7 = 36
軽音楽だけ25 - 7 = 18
写真だけ18 - 7 = 11

学生が入力するセルは、このプレビューでは空白です。

表の3つの数を計算する

コマンド
python3 -c "print(25 + 18 - 7, 25 - 7, 18 - 7)"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

「どちらかに入っている人は、25 + 18 = 43 人」と考える人が多くいます。それでは、両方に入っている7人を2回数えています。足したら、重なりを1回分引きます。それが包除原理です。

さらに挑戦

3つの集合では、3つの重なりを引いたあと、3つ全部の重なりを1回足し戻します。引きすぎるからです。

A が20、B が15、C が10、A と B が6、A と C が4、B と C が3、3つ全部が2のとき、和集合の大きさを求めましょう。

このラボとソースについて: コンパイラとアーキテクチャのラボ:gcc、flex、bison、RISC-V を1台の VM で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。