Comment detail
四字熟語パズルの作成 (Nested Flatten)
重複無しの8312件を食わせて走らせてみました。
OS:Windows XP Home SP2
CPU:AMD Sempron 3400+ 1.99GHz
メモリ:480MB
処理時間:507.078125秒
件数:12117件
組み合わせた後に重複チェックをしているので、元データの重複は件数に影響しないようです。
僕は
>四角く配置することのできる熟語の組み合わせを探すプログラム
と言うところに着目して、同じ熟語の組み合わせなら、四角に組む順番が違っても同一の組み合わせと判断して結果から除いています。
もっと厳密に定義をすれば件数が揃うんじゃないでしょうか。
それよりも、この桁違いの遅さは何なんでしょうorz .NETだからって極端に遅いって事も無いと思うのですが…。
OS:Windows XP Home SP2
CPU:AMD Sempron 3400+ 1.99GHz
メモリ:480MB
処理時間:507.078125秒
件数:12117件
組み合わせた後に重複チェックをしているので、元データの重複は件数に影響しないようです。
僕は
>四角く配置することのできる熟語の組み合わせを探すプログラム
と言うところに着目して、同じ熟語の組み合わせなら、四角に組む順番が違っても同一の組み合わせと判断して結果から除いています。
もっと厳密に定義をすれば件数が揃うんじゃないでしょうか。
それよりも、この桁違いの遅さは何なんでしょうorz .NETだからって極端に遅いって事も無いと思うのですが…。
同じアルゴリズムでJavaでも書いてみました。更に遅くなりました。コード晒すの恥ずかしくなってきました…。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | import java.io.*;
import java.util.*;
class YojijukugoPuzul{
public static void main(String args[]){
long start = System.currentTimeMillis();
ArrayList<String[]> ans = new ArrayList<String[]>();
ArrayList<String> jukugoList = new ArrayList<String>();
//読み込み
try{
BufferedReader br = new BufferedReader(new FileReader(args[0]));
while(true){
String str;
if((str = br.readLine()) == null) break;
else jukugoList.add(str);
}
br.close();
}catch(IOException err){System.out.println(err);}
//組み合わせ探索
for(String top : jukugoList){ //top
for(String right : jukugoList){ //right
if(top.charAt(3) == right.charAt(0)){
for(String bottom : jukugoList){ //bottom
if((right.charAt(3) == bottom.charAt(3)) && (top.charAt(3) != bottom.charAt(0))){
for(String left : jukugoList){ //left
if((bottom.charAt(0) == left.charAt(3)) && (left.charAt(0) == top.charAt(0))){
String[] check = new String[]{top,right,bottom,left};
if( !isChofuku(check,ans) ){
ans.add(check);
//出力
System.out.println(check[0]);
System.out.println(check[3].substring(1,2) + " " + check[1].substring(1,2));
System.out.println(check[3].substring(2,3) + " " + check[1].substring(2,3));
System.out.println(check[2]);
System.out.println();
}
}
}
}
}
}
}
}
//出力
System.out.println(ans.size());
long end = System.currentTimeMillis();
System.out.println((end - start) + "ms");
}
//組み合わせの重複をチェック
public static Boolean isChofuku(String[] check , ArrayList<String[]> ans){
for(String[] str : ans){
int count = 0;
for(String str_ : check){
for(String str__ : str){
if(str__.equalsIgnoreCase(str_)){
count++;
}
}
}
if(count == 4){
return true;
}
}
return false;
}
}
|





あにす
#3667()
[
VB.net
]
Rating0/0=0.00
サンプル(重複あり)8,582件
結果12,117件
CPU2.0GHz 610秒orz
Rating0/0=0.00-0+
1 reply [ reply ]