はじめMath! Javaでコンピュータ数学

第36回 ド・モルガンの法則

この記事を読むのに必要な時間:およそ 2.5 分

以前に論理の数学でド・モルガンの法則を学びました。論理式を変形するための便利な法則です。この法則は,集合の式にも適用できます。今回は復習をかねて集合についてのド・モルガンの法則を学びます。集合の数学は,情報を絞り込む・情報を統合するといった用途に活躍します。今回もう一度復習することで,知識の定着をはかりましょう。

大工仕事に例えてみれば,今回のような学習は,以前に身につけた技術を,違う材質でもう一度稽古してみるようなことでしょう。紙と鉛筆を用意して,自らの手で法則が確かに成り立っていることを確認しましょう。

図36.1 異なる材質で技術(うで)を磨く

図36.1 異なる材質で技術(うで)を磨く

ド・モルガンの法則

ド・モルガンの法則は集合の式の変形法則です。考え方は論理の数学で学んだド・モルガンの法則と全く同じです。ただし,論理和の記号(+)が和集合の記号(∪)に,論理積の記号(・)が積集合の記号(∩)に変わります。

ド・モルガンの法則は,和集合の演算子と積集合の演算子を交換します。補集合の記号( ̄)の位置が変化していることに注意しましょう。論理の数学でも同じ名称の法則を学びましたね。図を用いると法則が確かに成り立っていることが具体的にわかります図36.2)。

式36.1について,左辺に対して,右辺の式が等しいかどうかを確認してみましょう。右辺のは集合Aに含まれない部分のこと。は集合Bに含まれない部分のこと。でハッチングの施されたところを全て集めたものになりますから,確かに図の通りとなります。

図36.2 集合のド・モルガンの法則(キャップをカップに)

図36.2 集合のド・モルガンの法則(キャップをカップに)

問題:オイラー図を用いて,ド・モルガンの法則が成り立つことを示してください。

ド・モルガンの法則の式36.2の右辺と左辺が等価であることを,オイラー図を用いて示してください。

解説

ド・モルガンの法則の式36.2の右辺と左辺が等価であることを,オイラー図を用いて示してください。

図36.3 集合のド・モルガンの法則(カップをキャップに)

図36.3 集合のド・モルガンの法則(カップをキャップに)

左辺に対して,右辺の式が等しいかどうかを確認してみましょう。右辺のは集合Aに含まれない部分のこと。は集合Bに含まれない部分のこと。両方でハッチングの施されたところを集めたもの。どちらか一方でしかハッチングの入っている部分は含まないことになりますから,確かに図の通りとなります。

集合の数学のおわりに

今回で集合の数学の学習を終わります。集合の数学は,論理の数学を学んだ後ではあまり目新しい部分がありません。あえて新しいことと言えば,物事を集合の数学で表現すると新しい視点を得られると言うこと,和集合を取る際の要素のダブりに気をつける必要があることなどでしょう。しかしながら,実際のデータ処理をJava言語でコーディングしようとすると,なかなか大変です。集合の演算は,数値の加減乗除のように演算子ひとつ記述すれば済むものではないからです。

今回の学習を通じて,以上のようなことを感じていただけたなら,大きな収穫だったと思います。

今回のまとめ

  • 集合に関するド・モルガンの法則を学びました。
  • オイラー図を用いてド・モルガンの法則を確認しました。

コラム HashMap

今回の連載中では,Java言語を用いた集合の取り扱いに配列とArrayListを取り上げました。そのほか,連載第30回でJava言語にはMapやSetといった言語要素が用意されていることを述べました。参考までに今回は,そのMapのひとつ,HashMapを紹介します。

配列やArrayListは,保持する要素の特定を添字で行います。添字とは,要素につけられた番号札です。番号札がついていますから,順番があるわけです。物事を順番に処理したい場合に便利です。

HashMapは配列やArrayListと同様に,要素を保持する仕組みなのですが,添字を持ちません。「キー」「値」のペアで一つのデータとして保持します。

データの呼び出しには,キーを指定するか,値そのものを用いるかどちらかになります。

次のサンプルコードをご覧下さい。

サンプル::ExHashMapTest.java

//サンプルコード
//HashMap の利用例
//filename : ExHashMapTest.java

import java.util.HashMap;

public class ExHashMapTest{

  public static void main(String args[]){

    HashMap hmap = new HashMap();

    hmap.put("gihyo","技評太郎");
    hmap.put("devel","出倍良拝");
    hmap.put("progr","婦路蔵間");
    System.out.println("hmap の要素数は"+hmap.size()+"です。");
    System.out.println("hmap contains " + hmap);

    if (hmap.containsKey("gihyo")){
      System.out.println("キー「gihyo」の値は"+hmap.get("gihyo"));
    } else {
      System.out.println("キー「gihyo」の値はありません。");
    }

    if (hmap.containsValue("婦路蔵間")){
      System.out.println("値「婦路蔵間」は格納されています。");
    } else {
      System.out.println("値「婦路蔵間」は格納されていません。");
    }

    hmap.remove("gihyo");
    System.out.println("キー「gihyo」と値のペアを削除しました。");
    if (hmap.containsKey("gihyo")){
      System.out.println("キー「gihyo」の値は"+hmap.get("gihyo"));
    } else {
      System.out.println("キー「gihyo」の値はありません。");
    }
    System.out.println("hmap contains " + hmap);
  }
}

実行結果は次の通りです。

> java ExHashMapTest

hmapの要素数は3です。
hmap contains {devel=出倍良拝, gihyo=技評太郎, progr=婦路蔵間}
キー「gihyo」の値は技評太郎
値「婦路蔵間」は格納されています。
キー「gihyo」と値のペアを削除しました。
キー「gihyo」の値はありません。
hmap contains {devel=出倍良拝, progr=婦路蔵間}

配列やArrayListに比べて,HashMapを使った方が良いのはどんな場合でしょうか。

配列やArrayListでは,単純に使っているうちは添字と値というセットでしかデータを取り扱えませんが,HashMapなら「ひらがなの読み」をキーとし,「漢字の氏名」を値とする,というデータの保持の仕方が出来ます。順番関係なく,なにがしかの値を保持しておき,取り出す,という場合には,シンプルで良い手段となるでしょう。

とはいえ,そのような仕事はArrayListのcontainsメソッドを用いれば良いので,絶対にHashMap出なければならないという理由としては弱いでしょう。

実は,配列やArrayListを用いるか,HashMapを用いるかという議論は,データ処理の効率・速度という実に難しい判断を必要とするものなのです。あるアルゴリズムでデータを処理した場合,「配列を用いるとこれだけの計算量となるが,HashMapならこれだけで済む」といった議論が必要になって初めて,HashMapを用いる本当の意味が生まれるのです。

プログラミング入門者の皆さんにとっては,HashMapはまだまだ必要のない高級な道具なのかもしれません。HashMapを用いるよりは,配列やArrayListで身近な問題を上手に処理する訓練を積んで行くことをお勧めいたします。そうするなかで,配列やArrayListで組んでみて,どうも具合が悪い,HashMapならコードがシンプルになりそうだぞ?と思える場合に用いてみると良いでしょう。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。

コメント

コメントの記入