━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ データ構造・アルゴリズム論 チャレンジ問題 (集合の分割の列挙) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
●報告内容 以下の問題への答案のファイル(プログラムファイルと報告ファイル)を作り, 1月12日(金)の10:30までに Moodle で提出する. 答案の内容に応じて,最大で期末試験10点分の加点評価がなされる. プログラムや実行結果が単に羅列されたものより,丁寧な解説や考察のあるものが 高く評価される. ●問題 (1) 入力として非負整数 n が与えられたときに,集合 {1,…,n} を 非空部分集合の族へと分割する方法すべてを,重複なく列挙するプログラムを作れ. 入力はコマンドライン引き数から受け取り,結果は標準出力に書き出すこと. たとえば入力 n=4 に対して,次の15個の集合族を出力できればよい. ---------------------------------------------------------------------- {{1,2,3,4}} {{1,2,3},{4}} {{1,2,4},{3}} {{1,2},{3,4}} {{1,2},{3},{4}} {{1,3,4},{2}} {{1,3},{2,4}} {{1,3},{2},{4}} {{1,4},{2,3}} {{1},{2,3,4}} {{1},{2,3},{4}} {{1,4},{2},{3}} {{1},{2,4},{3}} {{1},{2},{3,4}} {{1},{2},{3},{4}} ---------------------------------------------------------------------- すべての分割が重複なく列挙できれば,出力はこの通りでなくてもよい. (2) 作成したプログラムのアルゴリズムとその動作を,小さな n (3〜5程度)の 実行結果を使って解説せよ. (3) 講義で学んだ(あるいは独学した)データ構造やアルゴリズム設計技法が, 作成したプログラムでどのように使われているかを,使用理由と共に述べよ. (4) 作成したプログラムの時間計算量について考察し,小さな n (0〜12程度) に ついての実行時間に基づいて n=15 の場合の実行時間を推測または実測せよ. 計算量の解析が難しいなら,分割の総数の変化に基づいて考察してもよい. (5) 余力があれば,データ構造やアルゴリズムを変えたプログラムを作り, 実行時間や記憶量の観点での得失を論じよ. ●提出要領 問題(1)の答案は partitions.c (拡張子は適宜変更,他のファイルも必要なら追加) というプログラムファイルに書き,問題(2)〜(5)の答案は report.pdf という 報告ファイルに書く.各ファイルの冒頭には学籍番号と氏名を書くこと. プログラミング言語には paiza.IO 上で動作するものを使える. プログラムには,適度に注釈を入れて読みやすくする.また,報告でプログラムや 実行結果を引用して説明する際には,どの部分の説明か分かりやすいように, 行番号や記号等の目印を付ける. 基礎知識の文献調査や,他人との意見交換を推奨するが,プログラムや報告は 自らの理解に基づいて自作する.他人の文書(または生成AI等の出力)を 参考にした場合には,ファイル中に出典(本の情報やウェブページのアドレス等)を 明示すること.また,他人と相談して答案を作った場合にも, 誰とどの部分について相談し,自分で考えた(作った)部分がどこかを明記すること. 出典を示さずに他人の文書等を転載(流用)した報告は,0点と評価される. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 授業のホームページ 山田 俊行 https://www.cs.info.mie-u.ac.jp/~toshi/