オブジェクト指向の入り口

学習内容

  • Aizu Online Judge
    • volume0019 Factorial
    • volume0020 Capitalize
    • volume0021 Parallelism
    • volume0022 Maximum Sum Sequence
  • Java言語で学ぶデザインパターン入門

デザインパターン入門

オブジェクト指向の利点に触れることができている。
読んでいてとても勉強になり楽しい。
練習問題がついており、実際にクラスに変更を加えていくことでクラスの拡張や変更を体験できる。
まえがきで「どういう場面で使えるか」「こういう場面で見たことがある」と意識しながら読むとよい、とされている。
JavadocやandroidSDKをちらちら見たり、思い出したりしながら読んでいる。

Adapterパターンでできること

十分にテストされており、バグが少なく、実績のあるクラスを部品として使用することができる。
クラスの仕様だけ分かれば、実装が分からなくても新しいクラスを作成することができる。
古いバージョンと新しいバージョンの間で互換性を保つためのクッション。

速さが足りない

制限時間が1秒であるにもかかわらず最大の実行時間を9秒から短くすることができないAOJ volume 0022。
5時間ほどかけて分かったのは、自分の書いたコードで最も処理時間がかかっているのは、大小比較のif文と値の入れ替えであった。
for文の実行回数が5000+5000*5000となるループで毎回このif文を実行しているため、処理を完了するのに時間がかかっているようだ。
入力される数値データに規則性はない。
そのデータ特性にあったアルゴリズムが考え出せず、結果としてただの総当りとなっていることが原因。
ソート済みの配列から最大値を取り出しif文で比較してみたが、実行時間が大幅に増える結果となった。

コードチューニング?

AOJ volume 022の解答プログラムに対して行ったこと。

  • 入力値にあわせて配列の領域を確保
  • scannerのクローズ
  • 変数の再利用
  • 代入先と代入元の型を同じにして、型変換をなくす
  • 加算を置き換える
  • for文をwhile文にする
  • さらに変数の再利用

この中では、型変換をなくす、が一番効果的で、実行時間を8秒に縮めることができた。
その他は1%前後の高速化で微々たるレベル。