━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
データ構造・アルゴリズム論 チャレンジ問題 (文字列の辞書順列挙)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
●報告内容

以下の問題への答案のファイル(プログラムファイルと報告ファイル)を作り,
1月17日(金)の14:40までに Moodle で提出する.
答案の内容に応じて,最大で期末試験10点分の加点評価がなされる.
プログラムや実行結果が単に羅列されたものより,丁寧な解説や考察のあるものが
高く評価される.

●問題

(1) 入力として二つの非負整数 m と n が与えられたときに,英文字 a〜z のうちの
始めの m 文字から(文字の重複を許して)最大で n 個を,(文字列の重複を許さず)
辞書順にすべて列挙するプログラムを作れ.入力はコマンドライン引き数から受け取り,
結果は標準出力に書き出すこと.たとえば,入力 m=3,n=2 に対して
次の13個の文字列を出力できればよい.先頭の空文字列に注意すること.
----------------------------------------------------------------------

a
aa
ab
ac
b
ba
bb
bc
c
ca
cb
cc
----------------------------------------------------------------------

(2) 作成したプログラムのアルゴリズムとその動作を,小さな m, n (2〜4程度)の
実行結果を使って解説せよ.

(3) 講義で学んだ(あるいは独学した)データ構造やアルゴリズム設計技法が,
作成したプログラムでどのように使われているかを,使用理由と共に述べよ.

(4) 作成したプログラムの時間計算量について考察し,m=5 の場合の
小さな n (0〜11程度) での実行時間に基づいて,m=5, n=15 の場合の
実行時間を推測(または実測)せよ.計算量の解析が難しいなら,
文字列の総数の変化に基づいて考察してもよい.

(5) 余力があれば,データ構造やアルゴリズムを変えたプログラムを作り,
実行時間や記憶量の観点での得失を論じよ.

●提出要領

問題(1)の答案は strings.c (拡張子は適宜変更,他のファイルも必要なら追加)
というプログラムファイルに書き,問題(2)〜(5)の答案は report.pdf という
報告ファイルに書く.各ファイルの冒頭には学籍番号と氏名を書くこと.

プログラミング言語には paiza.IO 上で動作するものを使える.
プログラムには,適度に注釈を入れて読みやすくする.また,報告でプログラムや
実行結果を引用して説明する際には,どの部分の説明か分かりやすいように,
行番号や記号等の目印を付ける.

基礎知識の文献調査や,他人との意見交換を推奨するが,プログラムや報告は
自らの理解に基づいて自作する.他人の文書(または生成AI等の出力)を
参考にした場合には,ファイル中に出典(本の情報やウェブページのアドレス等)を
明示すること.また,他人と相談して答案を作った場合にも,
誰とどの部分について相談し,自分で考えた(作った)部分がどこかを明記すること.
出典を示さずに他人の文書を転載(流用)した報告は,0点と評価される.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
授業のホームページ

山田 俊行
https://www.cs.info.mie-u.ac.jp/~toshi/