テキストpp.214--223を参照。
2つの配列をマージするプログラムを変更すると、配列を集合と見なした場合の共通部分を求めることができます。 ここで、配列 a と配列 b は、それぞれソート済みで値の重複はないと仮定します。
共通部分を求めるには、配列 a 内の注目要素 a [ pa ]と、配列 b 内の注目要素 b [ pb ]が等しければ、その値を配列 c の c [ pc ]に格納するとともに、カーソル pa 、 pb 、 pc を進めます。 等しくなければ、小さいほうの値のカーソルのみ進めます。 これを、カーソル pa が配列 a の末尾に達するか、カーソル pb が配列 b の末尾に達するまで繰り返します。 配列 a に残った要素や、配列 b に残った要素は、コピーしません。
まず、p.215のList 6-12のメソッド merge を変更して、配列 a と配列 b の共通部分を配列 c に格納し、共通部分の要素数 pc を返却するようにしてください。 そして、配列 c の画面出力については、 c [0]から c [ pc -1]までにしてください。
class MergeArray2 { static int merge(int[] a, int na, int[] b, int nb, int[] c) { return pc; } public static void main(String[] args) { int[] a = {2, 4, 6, 8, 11, 13}; int[] b = {1, 2, 3, 4, 9, 16, 21}; int[] c = new int[13]; } }
PS ...\Desktop\java2> & ... 'MergeArray2' 二つの配列の共通部分 配列aとbの共通部分を配列cに格納しました。 …中略… c[0] = 2 c[1] = 4 PS ...\Desktop\java2>
余力のある人は、配列 a と配列 b をそれぞれソート済みで値の重複はないと仮定して、配列を集合とみなした場合の和集合を求めてください。
和集合を求めるには、配列 a 内の注目要素 a [ pa ]と、配列 b 内の注目要素 b [ pb ]が等しければ、その値を配列 c の c [ pc ]に格納するとともに、カーソル pa 、 pb 、 pc を進めます。 等しくなければ、小さいほうの値を c [ pc ]に格納するとともに、小さいほうのカーソルとカーソル pc を進めます。 これを、カーソル pa が配列 a の末尾に達するか、カーソル pb が配列 b の末尾に達するまで繰り返します。 そして、配列 a と配列 b に残った要素を配列 c にコピーします。
class MergeArray3 { static int merge(int[] a, int na, int[] b, int nb, int[] c) { return pc; } public static void main(String[] args) { int[] a = {2, 4, 6, 8, 11, 13}; int[] b = {1, 2, 3, 4, 9, 16, 21}; int[] c = new int[13]; } }
PS ...\Desktop\java2> & ... 'MergeArray3' 二つの配列の和集合 配列aとbの和集合を配列cに格納しました。 …中略… c[0] = 1 c[1] = 2 c[2] = 3 c[3] = 4 c[4] = 6 c[5] = 8 c[6] = 9 c[7] = 11 c[8] = 13 c[9] = 16 c[10] = 21 PS ...\Desktop\java2>
完成したら、答案(Javaプログラム)をメールで提出してください。 差出人は大学発行のメール・アドレス(学生番号@cis.twcu.ac.jp)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(12月19日)を明記してください。