Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

平成30年度春季基本情報午後問8

平成30年度春季 基本情報技術者試験(FE)の午後問題8はヒープソートについての問題でした。まさに基本という名にふさわしい題材だと思います。

疑似言語で書かれた問題をC言語にして実行してみました。

f:id:rahaema:20190502105506p:plain

h30h_fe_pm8.c

実行結果

$ gcc h30h_fe_pm8.c && ./a.out
Before:  15  5 30 60 45 20 10
After :   5 10 15 20 30 45 60

バブルソートとの速度比較

これだけで終わっては面白くないので、効率の悪いことで有名な O(n^2)アルゴリズムであるバブルソートと速度比較を行ってみました。

次のようにプログラムを変更。

#include <time.h>
#include <stdlib.h>

void bubbleSort(int data[], int num);

void bubbleSort(int data[], int num)
{
  int i, j;
  for (i = 0; i < num - 1; i++) {
    for (j = num - 1; j > i; j--) {
      if (data[j-1] > data[j]) {
        swap(data, j-1, j);
      }
    }
  }
}

int main(void)
{
  int hnum = 100000;
  int data[hnum], heap[hnum];
  clock_t c1, c2;

  srand((unsigned)time(NULL));
  for (int i = 0; i < hnum; i++) {
    data[i] = rand();
  }

  c1 = clock();
  heapSort(data, heap, hnum);
  c2 = clock();
  printf("Heap Sort   = %f[s]\n", (double)(c2-c1)/CLOCKS_PER_SEC);

  c1 = clock();
  bubbleSort(data, hnum);
  c2 = clock();
  printf("Bubble Sort = %f[s]\n", (double)(c2-c1)/CLOCKS_PER_SEC);
  return 0;
}

実行結果

要素の数を100000個でやってみたのが以下です。

$ gcc h30h_fe_pm8.c && ./a.out
Heap Sort   = 0.044185[s]
Bubble Sort = 40.557902[s]

ヒープソートO(n \log n)アルゴリズムですが、O(n \log n)O(n^2)アルゴリズムではこんなにも性能が違ってくるんですね。アルゴリズムを学ぶことがいかに大切かということが実感できる結果となりました。

プロを目指す人のためのRuby入門

今までRubyのプログラムを書くといっても、仕事での事務作業の効率アップのために簡単なRubyスクリプトを書くということがメインで、自分でクラスやモジュールを定義して、大規模なプログラムを作る機会がなかったので、どうしてもクラスやモジュールについての理解が進まないのですが、本書の特に

  • 第7章 クラスの作成を理解する
  • 第8章 モジュールを理解する
  • 第10章 yieldとProcを理解する

はとても分かりやすく書かれているなと思いました。RubyRubyそのものが面白いので、ソフトウェア開発に携わることがなくても学び続けて行きたいですね。

以下は、読み返すとき用のメモです。

  • p125 4.8.2 with_indexメソッドを使った添え字付きの繰り返し処理
  • p167 5.6.8 ハッシュの初期値を理解する

今まで、ハッシュを初期化するために以下のようなコードを書いてきましたが、その意味を理解することができました。

h = Hash.new { |hash, key| hash[key] = 'hello' }
  • p173 Column 条件分岐で変数に代入 / &.演算子
a&.upcase
  • p175 Column !!を使った真偽値の全変換
!!find_user
  • p187 6.3.3 キャプチャの結果に名前をつける
  • p188 6.3.4 正規表現と組み合わせると便利なStringクラスのメソッド
  • p310 8.7.2 module_functionメソッド
  • p314 Column Singletonモジュールを使う
  • p319 8.9.3 prependでモジュールをミックスインする
  • p320 8.9.4 prependで既存メソッドを置き換える
  • p389 10.5.2 &とto_procメソッド
  • p422 12.7 Rake
  • p427 12.8.2 Bundlerでgemの依存関係を管理する

西郷どん!

郷土(といっても隣県)の偉人ですが、恥ずかしながら明治維新で活躍した人くらいの認識しかありませんでした。大河ドラマでも話題ですね。どう映像化されていくのか見る楽しみが倍増しそうです。

巻末に参考文献のリストがありますが、本書を執筆するにあたり膨大な資料に目を通されていることにびっくりしました。これだけの下準備をしないと作品は生まれてこないんですね。この姿勢をぜひ見習っていきたいと思います。

AI vs. 教科書が読めない子どもたち

各章とも興味深い内容でしたが、特に「第3章 教科書が読めない――全国読解力調査」は衝撃的でした。今までの自分の認識は、

生徒は教科書を読めば分かるんだろうけど、面白くなさそうなので読んでいないだけ。読んでみたいと思わせることができればいいのでは…。

というもの。第3章で示されているデータをみると、とんだ勘違いだったと思い知らされました。基礎的読解力が不十分な集団がアクティブラーニングをやってもあまり効果が期待できないというのも納得。今後はいかに基礎的読解力を育めばいいのか、微力ながら考えていきたい。

AI vs. 教科書が読めない子どもたち

AI vs. 教科書が読めない子どもたち

ながい坂

初めて山本周五郎の本を読んでみました。徒士組という下級武士の子に生まれながらも、学問と武芸に励み次第に頭角を現していく三浦主水正の物語。どんな境遇にあっても、どんな逆境にあっても志を掲げ、事を成し遂げる三浦主水正に魅了された本でした。

時間を見つけてぜひ読み返したい一冊です。

ながい坂(上)

ながい坂(上)

ながい坂(下)

ながい坂(下)

銃・病原菌・鉄

サピエンス全史』は、「なぜ、私たち現生人類が食物連鎖の頂点に立ちえたのか?」を考えさせてくれる本。

本書は、「世界の富や権力は、なぜ現在あるような形で分配されてしまったのか?なぜほかの形で分配されたなかったのか?」について考えさせてくれる本です。

どちらも興味深いものでした。

銃・病原菌・鉄 上巻

銃・病原菌・鉄 上巻

銃・病原菌・鉄 下巻

銃・病原菌・鉄 下巻

Range Minimum Query (RMQ)

AOJの「Range Minimum Query(RMQ)問題」に取り組んでみました。

要約すると、数列A = \{a_0, a_1,...,a_{n-1}\}に対し、次の2つの操作を行うプログラムを作成する問題です。

  • update(i,x): a_ixに変更する。
  • find(s, t): a_s, a_{s+1},...,a_tの最小値を出力する。

単純で非効率なアルゴリズムならすぐに思いつきますが、効率の良いアルゴリズムとなると先人の知恵をお借りした方が良さそうです。参考サイトのスライドを頼りにというか、ほとんどそのままRubyで実装してみました。再帰を用いたqueryメソッドの実装が素晴らしいなと思います。

rmq.rb

参考

参考サイトのスライドの最初の方に、Union-Find木についての説明がありますが、これについて以前取り組んだものが以下です。