グラフと組み合わせ 課題 7 ( 解答例 ) 2013/5/27 1 列挙 n 個の文字の集合 { } S = a, a,, an の全てからなる文字列 つまり同じ文字を含まない 長さ n の文字列を列挙する 方法を考える 1. 何通りの文字列があるかを答えなさい また そのことが正しい

Similar documents
[ ] =. =3.5 3 =.3 =. =0.30 : (f i ) u i u i f i u i f i

文字列操作と正規表現

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

JAVA とテンプレート

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

a (a + ), a + a > (a + ), a + 4 a < a 4 a,,, y y = + a y = + a, y = a y = ( + a) ( x) + ( a) x, x y,y a y y y ( + a : a ) ( a : a > ) y = (a + ) y = a


<4D F736F F D B A836F838A F C83432E646F6378>

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

明解Javaによるアルゴリズムとデータ構造

Javaによるアルゴリズムとデータ構造

二分木ヒープとは 集合 リストから 最小な 要素を取り出す 二分木ヒープは そのための標準的データ構造 二分木ヒープを保存するデータ構造 二分木ヒープの操作のメソッド 対象となるデータクラス 識別のためのlabelフィールド 値を保持するvalueフィールド

人工知能入門

埼玉県学力 学習状況調査 ( 中学校 ) 復習シート第 3 学年数学 組 番 号 名 前 ( 図形 を問う問題 ) 1 レベル 6~8(H28 埼玉県学力 学習状況調査 ) 答え 度 2 レベル 9 10 (H28 埼玉県学力 学習状況調査 ) 答え

問題1 以下に示すプログラムは、次の処理をするプログラムである

Microsoft PowerPoint ppt

問題1 以下に示すプログラムは、次の処理をするプログラムである

とても使いやすい Boost の serialization

新・明解Javaで学ぶアルゴリズムとデータ構造

JavaプログラミングⅠ

ALG ppt

Java講座

シミュレーションの簡単な例 GUI 無しのシミュレーションを作る GUI を作る パラメタを設定するデモンストレーションをする 2 オブジェクト指向プログラミング特論

untitled

グラフの探索 JAVA での実装

04年度LS民法Ⅰ教材改訂版.PDF

Microsoft Word - NonGenList.doc

今回の内容 グラフとオブジェクト指向プログラミング Java を使う理由 Java の基本 Javaのライブラリ 開発 実行 クラスの再利用 クラス継承 抽象クラス 開発の要点

3 1 1 BCA ACD HP A AB BC ABC ONP x AM, CN x 30 DM DM! CN CN AM AMD 10 1 AB AC

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

基礎計算機演習 実習課題No6

熊本県数学問題正解

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

新・明解C言語 実践編

K227 Java 2

デジタル表現論・第4回

スライド 1

デジタル表現論・第6回

CollectionsとLambda式

Prog1_6th

2

新・明解Java入門


JAVA入門

手書認識 グラフ描画 Step2-2 手書認識 : 認識結果を PaintPanel で描画する < 属性付き文字列 AttributedString> 標準出力では分かりにくいうえに認識結果を使えないので 認識するごとに PaintPanel に文字を描画することにする ここで 数式はただの文字列

埼玉県学力 学習状況調査 ( 中学校 ) 復習シート第 3 学年数学 組 番 号 名 前 ( 数と式 を問う問題 ) 1 次の計算をしなさい レベル 6~8 1 (27x-36y+18) (-9) 答え 2 15x 2 y 5xy 2 3 答え 2 次の各問いに答えなさい レベル 9 10 (1)

48 * *2

プログラミングA

r1.dvi


Condition DAQ condition condition 2 3 XML key value

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

JavaプログラミングⅠ

2

IMO 1 n, 21n n (x + 2x 1) + (x 2x 1) = A, x, (a) A = 2, (b) A = 1, (c) A = 2?, 3 a, b, c cos x a cos 2 x + b cos x + c = 0 cos 2x a

新版明解C言語 実践編

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

スライド 1

JavaプログラミングⅠ

明解Javaによるアルゴリズムとデータ構造

新・明解Javaで学ぶアルゴリズムとデータ構造

Microsoft Word - NonGenTree.doc

Java Java Java Java Java 4 p * *** ***** *** * Unix p a,b,c,d 100,200,250,500 a*b = a*b+c = a*b+c*d = (a+b)*(c+d) = 225

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

I java A

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

Microsoft Word - keisankigairon.ch doc

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

JavaプログラミングⅠ

R R 16 ( 3 )

( a 3 = 3 = 3 a a > 0(a a a a < 0(a a a


解きながら学ぶJava入門編

基礎プログラミング2015

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Javaプログラムの実行手順

ex01.dvi

12~

Microsoft PowerPoint - prog03.ppt

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

Prog1_10th

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

ALG2012-A.ppt

2

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

memo

本サンプル問題の著作権は日本商工会議所に帰属します また 本サンプル問題の無断転載 無断営利利用を厳禁します 本サンプル問題の内容や解答等に関するお問 い合わせは 受け付けておりませんので ご了承ください 日商プログラミング検定 STANDARD(Java) サンプル問題 知識科目 第 1 問 (

untitled

解きながら学ぶC++入門編

オブジェクト指向プログラミング・同演習 5月21日演習課題

Microsoft PowerPoint - kougi9.ppt

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

JavaプログラミングⅠ

SystemC言語概論

Transcription:

グラフと組み合わせ 課題 7 ( 解答例 ) 2013/5/27 1 列挙 n 個の文字の集合 { S = a, a,, an 0 1 1 の全てからなる文字列 つまり同じ文字を含まない 長さ n の文字列を列挙する 方法を考える 1. 何通りの文字列があるかを答えなさい また そのことが正しいことを数学的帰納法で示しなさい 2. 文字列を列挙する再帰的アルゴリズムを構築しなさい 3. n = 4 の場合に 上記のアルゴリズムに従って文字列を列挙しなさい 列挙する途中の過程についても示しなさい 解答例 1. n 個の文字から構成され 同じ文字を含まない文字列の総数は n! である このことを数学的帰納法で証明する n = 1の場合 明らか ある文字数 n の時 文字列の総数が n! であると仮定する 各文字列に対して 新しい文字 α を加えた文字列を生成することを考える 文字の間が n 1箇所 それに先頭と末尾を加え 文字 α を加えて長さ n + 1の文字列を作る方法は通りである n! 個のそれぞれに一文字加える方法が n + 1 通りあるため ( n ) n! = ( n+ 1) + 1! 通りの文字列が生成される 2. アルゴリズムを enumstring( LA), とする ここで L は 文字列作成に既に使用した文字のリストとする つまり 最後には生成された文字列となる その初期値は空である A は 文字列として未だ使用されていない文字のリストとする その初期値は S である

3. S { abcd,,, enumstring( LA){, if ( A == 0 ) { L を印刷 else { B は A の複製 forall ( s A) { L L { s B B\{ s enumstring( LB), L L\{ s B B { s = の場合の動作例を示す 再帰関数を f とする f{ [ ],[ abcd,,, ] f{ [ a],[ bcd,, ] f{ [ ab, ],[ cd, ] f{ [ abc,, ],[ d ] f{ [ abcd,,, ],[ ] f{ [ abd,, ],[ c ] f{ [ abdc,,, ],[ ] f{ [ ac, ],[ bd, ] f{ [ acb,, ],[ d ] f{ [ acbd,,, ],[ ] f{ [ acd,, ],[ c ] f{ [ acdb,,, ],[ ] f{ [ ad, ],[ bc, ] f{ [ adb,, ],[ c ] f{ [ adbc,,, ],[ ] f{ [ adc,, ],[ d ] f{ [ adcb,,, ],[ ] f {[ b],[ acd,, ] f{ [ ba, ],[ cd, ] f{ [ bac,, ],[ d ] f{ [ bacd,,, ],[ ] f{ [ bad,, ],[ c ] f{ [ badc,,, ],[ ] f{ [ bc, ],[ ad, ] f{ [ bca,, ],[ d ] f{ [ bcad,,, ],[ ] f{ [ bcd,, ],[ a ] f{ [ bcda,,, ],[ ]

f{ [ bd, ],[ ac, ] f{ [ bda,, ],[ c ] f{ [ bdac,,, ],[ ] f{ [ bdc,, ],[ a ] f{ [ bdca,,, ],[ ] f {[ c],[ abd,, ] f{ [ ca, ],[ bd, ] f{ [ cab,, ],[ d ] f{ [ cabd,,, ],[ ] f{ [ cad,, ],[ b ] f{ [ cadb,,, ][ ] f{ [ cb, ],[ ad, ] f{ [ cba,, ],[ d ] f{ [ cbad,,, ],[ ] f{ [ cbd,, ],[ a ] f{ [ cbda,,, ],[ ] f{ [ cd, ],[ ab, ] f{ [ cda,, ],[ b ] f{ [ cdab,,, ],[ ] f{ [ cdb,, ],[ a ] f{ [ cdba,,, ],[ ] f{ [ d],[ abc,, ] f{ [ da, ],[ bc, ] f{ [ dab,, ],[ c ] f{ [ dabc,,, ],[ ] f{ [ dac,, ],[ b ] f{ [ dacb,,, ],[ ] f{ [ db, ],[ ac, ] f{ [ dba,, ],[ c ] f{ [ dbac,,, ],[ ] f{ [ dbc,, ],[ a ] f{ [ dbca,,, ],[ ] f{ [ dc, ],[ ab, ] f{ [ dca,, ],[ b ] f{ [ dcab,,, ],[ ] f{ [ dcb,, ],[ a ] f{ [ dcba,,, ],[ ] 2 実装 前問で作成した再帰的アルゴリズムをプログラムとして実装し 動作を確認しなさい 解答例 プログラムは別紙に示す 実行結果を以下に示す 各行の最後が列挙すべき長

さ 4 の文字列である a ab abc abcd abd abdc ac acb acbd acd acdb ad adb adbc adc adcb b ba bac bacd bad badc bc bca bcad bcd bcda bd bda bdac bdc bdca c ca cab cabd cad cadb cb cba cbad cbd cbda cd cda cdab cdb cdba d da dab dabc dac dacb db dba dbac dbc dbca dc dca dcab dcb dcba 24 strings are found.

EnumString.java package EnumerateString; import java.util.arraylist; import java.util.collections; import java.util.list; @author tadaki / public class EnumString { private List<Character> charlist = null; private final boolean debug = true; private List<String> stringlist; コンストラクタ @param chars 使用する文字の配列 / public EnumString(char chars[]) { 文字集合への変換 / charlist = createlist(); for (int i = 0; i < chars.length; i++) { charlist.add(character.valueof(chars[i])); 空のリストの生成 @return / static public <T> List<T> createlist(){ return Collections.synchronizedList(new ArrayList<T>()); リストの複製 @param orig 複製元 @return 複製 / 1/4 ページ

EnumString.java static public <T> List<T> copylist(list<t> orig) { if (orig == null) { return null; List<T> nlist = createlist(); for (T t : orig) { nlist.add(t); return nlist; public int enumeratestringmain() { List<Character> available = copylist(charlist); List<Character> str = createlist(); stringlist = createlist(); return enumeratestring(str, 0, available); 文字列の列挙 ( 再帰 ) @param str 構成された文字列 @param n これまでに構成した文字列の数 @param available 追加できる文字のリスト @return このメソッドによって構成した文字列の数の累積 / private int enumeratestring(list<character> str, int n, List<Character> available) { if (debug) { printstring(str, false); if (available.isempty()) {// 使用できる全ての文字を使用 stringlist.add(list2string(str)); n++; if (debug) { System.out.println(); else { List<Character> navailable = copylist(available); for (Character c : available) { str.add(c); navailable.remove(c); n = enumeratestring(str, n, navailable); str.remove(c); navailable.add(c); 2/4 ページ

EnumString.java return n; public String list2string(list<character> list) { StringBuilder b = new StringBuilder(); for (int i = 0; i < list.size(); i++) { b.append(list.get(i)); return b.tostring(); 文字列の印刷 @param str 構成された文字列 @param n 文字列の番 @param b 真ならば最終出力 / private void printstring(list<character> list, boolean b) { String str = list2string(list); System.out.print(" "); System.out.print(str); if (b) { System.out.println(); public List<String> getstringlist() { return stringlist; @param args the command line arguments / public static void main(string[] args) { char chars[] = {'a', 'b', 'c', 'd'; EnumString estring = new EnumString(chars); int n = estring.enumeratestringmain(); System.out.println(String.valueOf(n) + " strings are found."); List<String> list = estring.getstringlist(); for (String s : list) { System.out.println(s); 3/4 ページ

EnumString.java 4/4 ページ

main.cpp / File: main.cpp Author: tadaki Created on 2013/05/30, 10:35 / #include <cstdlib> #include "EnumString.h" using namespace std; / / int main(int argc, char argv) { char chars[] = {'a', 'b', 'c', 'd'; EnumString enumstring(chars, 4); int n = enumstring.enumstringmain(); cout << n; cout << " strings are found\n"; list<char> strlist = enumstring.getstringlist(); list<char>::iterator j; for (j = strlist.begin(); j!= strlist.end(); j++) { cout << j; cout << "\n"; return 0; 1/1 ページ

EnumString.h / File: EnumString.h Author: tadaki Created on 2013/05/30, 13:21 / #include <list> #ifndef EnumString_H #define EnumString_H using namespace std; class EnumString { public: EnumString(const char[], int); EnumString(const EnumString& orig); virtual ~EnumString(); int enumstringmain(); list<char> getstringlist(); private: int enumstring(char, int, int,list<char>); char charlist; list<char> strlist; bool debug; ; #endif / EnumString_H / 1/1 ページ

EnumString.cpp / File: EnumString.cpp Author: tadaki Created on 2013/05/30, 13:21 / #include "EnumString.h" EnumString::EnumString(const char chars[], int n) { charlist = new char[n + 1]; for (int i = 0; i < n; i++)charlist[i] = chars[i]; charlist[n] = '\0'; debug = true; EnumString::EnumString(const EnumString& orig) { EnumString::~EnumString() { int EnumString::enumStringMain() { // 最長文字列に対応した文字列領域を確保し NULL を書き込む char str; str = strdup(charlist); list<char> available; for (int i = 0; i < strlen(charlist); i++) { str[i] = '\0'; available.push_back(charlist[i]); strlist.clear(); // 文字列一覧の消去 return enumstring(str, 0, 0, available); // 列挙開始 文字列列挙 @param str 生成中の文字列 @param n 生成した文字列の総数 @param p 文字列中の作業位置 @return 生成した文字列総数 / int EnumString::enumString(char str, int n, int p, list<char> available) { if (debug) { cout << str; 1/2 ページ

EnumString.cpp cout << " "; if (strlen(str) == strlen(charlist)) { strlist.push_back(strdup(str)); n++; if (debug) { cout << "\n"; else { list<char> navailable; for (list<char>::iterator j = available.begin(); j!= available.end(); j++) { navailable.push_back(j); for (list<char>::iterator j = available.begin(); j!= available.end(); j++) { int k = p + 1; str[p] = j; navailable.remove(j); n = enumstring(str, n, k, navailable); str[p] = '\0'; navailable.push_back(j); return n; list<char> EnumString::getStringList() { return strlist; 2/2 ページ