20180611 プログラムの作法について サブツーチンの効用 まとまった一つの機能はサブルーチン(sunroutine)として作成する。 全体の把握、作業分担、保守(修正や設計変更)が容易になる。 サブルーチン、メソッド(method)、関数(function) サブツーチンの例 入力処理や出力処理の分離。 本質的な処理(ソートなど)を独立させて扱う。 引数(argument)の扱い データを引き渡す方法(引数、戻り値) 実引数と仮引数 プリミティブ型(int型、double型等)と参照型(配列、クラスインスタンス) 参照値:データの存在場所(メモリのアドレス) Javaは値渡し 値渡し(call by value)と参照渡し(call by reference) 配列やクラス(インスタンス)を引数にすると、「参照値の値渡し」が行なわれる。 データの存在場所(メモリのアドレス)を渡す。 変数の局所性あるいはスコープ(scope)について メソッド内で宣言して使用 ブロック内で宣言して使用 public static final について final 定数宣言(値を変更できなくする) static クラス変数宣言、インスタンス(instance)ではなくクラス(class)に所属 public 他のクラスから利用を可能にする。 ———— ———- アルゴリズム(algorithm)について 分割統治法 大きな問題を、複数の小さな問題に分割して扱う。 小さな問題のサイズは、必ず、元の問題のサイズよりも小さくなることが必要。 小さな問題が、元の問題と同じ構造をしている。 簡単に解けるようになるまで、分割を繰り返す。 問題の規模が小さい場合(データが1または2個の場合に)に自明な解があることが必要。 最後に、複数の小さな問題の解を統合して、元の問題の解とする。 バケットソート(bucket sort)が最速。ただし、データの分布に強い条件を必要とする。 クイックソート(quick sort)はバケットソートの改良版とも見なせる。 2個のバケットを再帰的に利用する方法 ピボット(pivot)の扱い 選択方法の工夫 中位置または先頭のデータを用いても良い。 問題のサイズの縮小の程度を保証する方法が良い(複数のサンプル値の中央値等)。 ピボットに等しいデータをどちらのグループに分類するか? どちらでも良い。 どちらのグループもデータが0個にならないように決定する(分割統治法の要件)。