• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字列生成を総当りで行う場合)

文字列生成の総当り方法についての質問

このQ&Aのポイント
  • 文字列生成を総当りで行う場合について質問があります。
  • 実際の文字列生成処理において、メモリ不足や計算量の問題が発生する可能性があるため、効率的な方法を知りたいです。
  • 特に、複数の文生成や生成した文を効率良く使いまわす方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

アルゴリズムなどがわからないわけではなさそうなのでアドバイスだけ・・・ >今のプログラムでは、あらかじめ何個の文ができるか計算してから文を生成しています。 億単位の文字列を生成してから処理するのではメモリが足りなくなるのも無理はありません。使う時に生成すればよいのです。 一応サンプルを書いてみました。 public class Parser { private String[][] elements = null; private int[] index = null; public Parser(String str){ String[] buf = str.split("/"); elements = new String[buf.length][]; for(int i = 0; i < buf.length; i++){elements[i] = buf[i].split(",");} index = new int[buf.length]; for(int i = 0; i < index.length; i++){index[i] = 0;} } public boolean hasNext(){ if(index[0] >= elements[0].length){ return false; } return true; } public String next(){ StringBuffer sb = new StringBuffer(); for(int i = 0; i < index.length; i++){ sb.append(elements[i][index[i]]); if(i < index.length - 1){sb.append("/");} } addIndex(); return sb.toString(); } private void addIndex(){ index[index.length - 1]++; for(int i = index.length - 1; i > 0; i--){ if(index[i] >= elements[i].length){ index[i] = 0; index[i - 1]++; } } } public static void main(String[] args){ Parser p = new Parser("あ,い/うえ/おか,き,くけこ/さ/しす"); while(p.hasNext()){ // ここを任意の処理に置き換える System.out.println(p.next()); } } } このParserというクラスは文字列を生成するための情報だけ持ち、next()というメソッドを呼び出したときに文字列を生成します。 これにより無駄なメモリの消費を押さえることができます。 ※文字列生成のアルゴリズムは条件を満たしてますが適当です。

sasa100
質問者

お礼

素早いお返事ありがとうございます。こちらのプログラムをテストプログラムに載せて走らせましたら、希望通りの動きを得る事ができました。 今から実際の処理に使っている本プログラムに載せて走らせてみます。また何か異常が見つかったら(これが解決されることで新たな問題が浮かび上がるかも…?)宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マルコフ性による文字列生成

    0と1の文字列をマルコフ性を用いて生成したいです。 例えとして、 ・初期値:0 ・0の時、次に0の確率:0.7  0の時、次に1の確率:0.3 ・1の時、次に1の確率:0.7  1の時、次に0の確率:0.3 と与えた時、10桁の文字列を生成するプログラム。 といったものです。 forやwhileの反復構造を使ってプログラムを作れば出来る気がするのですが、確率を計算式でどのように扱えば良いのか分からず詰まっております。 よろしければ、どなたか教えて下さいませm(_ _)m

    • ベストアンサー
    • Java
  • 文字列操作

    テキストを読みこんで、そのテキストにある単語を抽出するプログラムを作ろうとしています。単語の区切り文字はスペースかタブで、1文字ずつ読みこんで行こうともいます。 しかし、1文字ずつ読みこむ関数fgetcは返値がint型のようです。1文字ずつよみこみながら読みこんだ文字がスペースかタブで無いか見たいのですが、fgetcのint型返り値をchar文字列と比較するにはどうしたら良いでしょうか。

  • 文字列の操作

    こんにちは。 以下のような、文字列があるとします。 NUMBER1(ヌル\0)からNUMBER1000(ヌル\0)までの文字列があるとします。 NUMBERは付属で、ほしい文字列が1から1000までNUMBERの次にある場合、1から1000までを取得する方法として、 Buf[100] int x=0; while(Buf[x]!='\0') //ナル文字までの長さを取得 x++; memmove(&Buf[0],Buf[x-1],4); //NUMBER1の場合、長さは7。しかしほしい文字列は第6要素なのでx-1。 しかし・・・これを行うと、 NUMBER10:長さ8 NUMBER100:長さ9 ・ ・ となり、二桁以上の場合は、memmove(&Buf[0],Buf[x-2],4)と、 第2引数を手動で可変しなければなりません。 そこで、NUMBER\01\0 NUMBER\01000\0というように、 NUMBERの次にヌル文字(あってますでしょうか?)\0を挿入し、次の要素に1から1000まで文字列を挿入。そして文字列終端が分かるように再度\0を挿入します。 しかしこのような場合、ヌルを2つ挿入することで、上記に示したプログラムでは、手前の\0までしか長さを取得しないので、うまくいきません。 そこで、文字列の区切りを示すための方法として、なにかありますでしょうか? 文字列は最後に、\0を挿入することで判別すると書いてありますが、 NUMBERVISUALC++\0というような文字列を配列に格納してある場合、 NUMBERとVISUALC++をどのように分けて取得するのでしょうか? それとも、第6要素から取得した文字列があると言う事が分かっている場合、第6要素からを指定するプログラムを作るということになるのでしょうか? よろしくお願いします。

  • 空白文字列の生成

    今、javascriptの勉強をしているのですがインターネットで調べてみても、分からないところがあるので教えてください。 問題のプログラム仕様は 空白文字列(スペース)を生成する関数を作る。 関数を利用して、イメージファイルの先頭にスペースを表示していく。 コードの入力手順は 1、空白文字列を作成するspc(n)関数を作る for(i=1; i<n; i++) s=s+" "; return s; 2、イメージファイルを表示する。 3、for文を使用して「i」が1,3,5,7,9になるように繰り返しを行う。 4、関数spc(i)でi個分の空白文字列と生成し、「スペースi」とイメージファイルの間に表示させる。 という問題なのですが2番と3番はできるのですが1番と4番が分からないので教えてください。お願いします

  • アルファベットを含むランダムな文字列を生成するには?

    通常の数字を用いた乱数を発生させるには OrderNo + Int(17 * Second(Time) * Rnd) :OrderNoはDB上にある注文番号の最終レコード値です という感じで、とりあえず適当にランダムな値を自動で生成させることができるのですが、 アルファベットなどの文字を含む場合のランダムな文字列の生成はどのようにすればよいのでしょうか? 感じできには、 UkB1PgMJ zK22fw2W N1np8zDb DbetjqKq Cj58pfYm というものです。 例は、小文字の[i][l][o]と大文字の[I][L][O]と数字の[0]を含まないランダムな文字列を8桁で生成しています。 (使用したソフトは、Fapsis氏のPassword Creator TypeB Ver3.5です) 具体的には何か関数で、このような文字列をランダムに発生させるものがあるのでしょうか?

  • int型の文字列について

    文字列を扱う場合はchar型をつかいますが、int型がchar型より大きいメモリ領域を確保しているとすると、int型で文字列を扱っても問題はないのではと思いました。 実際にやってみると、処理系によって問題なく作動するものとそうでないものが有りますが、基本的な考え方として文字列をint型で扱うことは問題があるのでしょうか? ご存知の方よろしくお願いいたします。 <補足> 要は、255以下の数字を扱うときに、char型でないといけないという制約はなく当然int型を使えるように、文字列においてint型を使うことは、基本的な考え方として問題なのかをお聞きしたい。 当然、処理系において、ルール的に禁じている場合は使えないということは理解できますが。

  • C#で string型の文字列で次の3つの処理をしたいのですが、具体的

    C#で string型の文字列で次の3つの処理をしたいのですが、具体的にどう記述すればよいでしょうか? string s = "ABCあいうDEおかFGHき"; int pos1 = ???? //(1)DEの位置を求める int pos2 = ???? //(2)FGHの位置を求める //(3)pos1とpos2を使って「おか」の文字列をtにセットする ????

  • 文字列の検索と比較

    文字列の検索と比較 以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 力して下さい」などの画面表示)を行うこと. (1) 文字配列name[5][64] を作成する. (2) キーボードから5 人分の名前を入力し,name 配列に格納する. (3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示 する.ただし,見つからなかった場合には,「見つかりません」と表示する. (4) 「quit」が入力されるまで(3)の処理を繰り返す. という処理です・・・・・。 #include <stdio.h> int main(void){ char name[5][36]; int i; for(i = 0; i < 5; i++ ){ printf("%d番目の名前を入力:", i + 1); scanf("%s", name[i] ); } printf("五人の名前を入力しました。\n"); printf("どこに格納されているか検索します。名前を入力:"); scanf("%s",name); /* ここに配列の何番目に格納されているかを検索して表示するプログラムを作成する ただし,見つからなかった場合には,「見つかりません」と表示する. 「quit」が入力されるまで処理を繰り返す処理を書く?? */ getchar(); getchar(); return(0); } 検索された文字と入力された文字が同じであることの処理はどうすればいいのでしょうか? 二つの配列を用意してループ文?でしょうか?

  • 文字列の部分読み込み

    C言語によるプログラムを勉強中なのですが、分からないことがあるので質問させてください。 「fgets」を用いてファイルから一行分の文字列を読み込んだのですが、この文字列の○文字目から×文字目を読み込む関数などはあるのでしょうか? もし無ければ、どのようにしたら読み込めるのでしょうか? 読み込んだ文字列は □□□□1234□□□5678□□abcd のようなもので、□は半角のスペースです。 区切り文字などが無く、先頭の半角スペース部分に文字が入る場合もあるので、○文字目から×文字目のように指定したいと思っています。 初心者で申し訳ありませんが、よろしくお願いいたします。

  • 文字列の入れ替え

    2つのchar型配列x[],y[]に格納された文字列を入れ替えるプログラムを作成せよ。ただし入替え処理には、関数swap_array(char [],char [])を作成して用いること。という問題なのですが、下記の実行例では、2つの文字列xとyをキーボードから入力し、入れ替えた後に表示している。 <実行例> % ./irekae 文字列x (20字まで)? Mojiretsu 文字列y (20字まで)? Irekae 関数swap_array()を呼び出しました 入替後の x: "Irekae" 入替後の y: "Mojiretsu" % となっているのですが文字列を格納するところまでしかわかりません。 どなたか教えていただけないでしょうか? #include<stdio.h> int main(void) { char x[21]; char y[21]; printf("文字列 (20字まで)? "); scanf("%s", x); printf("文字列 (20字まで)? "); scanf("%s", y);