我通过java创建了一个文本文件。并且文件应该包含长度为n的所有可能的0和1组合。
例如,n = 3的组合是:
000,001,010,011,100,101,110,111
并且文件应包含:
000001010011110
而不是:
000001010011100101110111
因为算法会检查每个组合是否已存在于文件中。
我已经开发了这样做的算法,但由于检查文件中是否已经存在组合的方法(inFile()),因此它非常慢。
并且我不能使用可能包含组合的String,因为如果我将尝试生成长度为20,则字符串的长度将为2 ^ 20 * 20,并且需要时间来进行eclipse来分析它。
算法:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test
{
public static String FileName = "file.txt";
public static int size = 20;
public static FileReader fr;
public static BufferedReader br;
public static FileWriter fw;
public static BufferedWriter bw;
public static void main(String[] args) {
try
{
fw = new FileWriter(FileName, true);
bw = new BufferedWriter(fw);
try
{
fr = new FileReader(FileName);
br = new BufferedReader(fr);
doit(size);
System.out.println("\n>> finished");
br.close();
}
catch(FileNotFoundException e)
{
System.out.println("File was not found!");
}
catch(IOException e)
{
System.out.println("No file found!");
}
bw.close();
}
catch(FileNotFoundException e)
{
System.out.println("Error1!");
}
catch(IOException e)
{
System.out.println("Error2!");
}
}
public static void doit(int l) {
String s="",c="";
for(int i=0;i<l;s+="0",c+="1",i++);
write(s);
while(!s.equals(c)) {
for(int z=l-1;z>=0;z--) {
if(s.charAt(z) == '1')
continue;
s = s.substring(0,z);
s += "1";
for(int b=0;b<l-z-1;b++) {
s+="0";
}
z=-1;
}
if(!inFile(s)) {
write(s);
}
}
}
public static boolean inFile(String sub) {
try
{
br = new BufferedReader(new FileReader(FileName));
String line = br.readLine();
if(line.indexOf(sub) != -1)
return true;
return false;
}
catch (FileNotFoundException e)
{
System.out.println("Error: file to read from not found");
return false;
}
catch (IOException e)
{
System.out.println("Error: file to read from not found - 2");
return false;
}
}
public static void write(String s) {
try
{
bw.write(s);
bw.flush();
}
catch (IOException e)
{
System.out.println("Error3!");
}
}
}
当长度更长(超过20)时,它会变得更糟。 我该怎么做才能让它更快?
感谢您的帮助。
答案 0 :(得分:1)
当生成长度为n的所有位串时,将有n ^ 2种可能性。要通过算法生成所有这些可能性,可以为小于n ^ 2的每个整数生成位串。
如在你的n = 3的例子中,3 ^ 2是8所以我们需要使用小于8的所有整数: 长度为3的位串为0是000。 长度为3的1的位串是001。 长度为3的2的位串是010。 3的长度为3的位串是011。 4的长度为3的位串是100。 长度为3的5的位串是101。 长度为3的位串为6。 7的长度为3的位串是111。
我们可以使用以下java方法生成这些:
Integer.toBitString(4)
将返回&#34; 100&#34;。但是,有一个问题,这不会用零填充数字,以便它达到适当的长度。
Integer.toBitString(1)
将返回&#34; 1&#34;。要解决这个问题,我们可以使用java方法用适当数量的空格填充整数,然后用0&#39; s替换空格如下:
String.format("%3s", Integer.toBinaryString(1)).replace(' ', '0')
使用for循环,您可以生成这些字符串并将其打印到文件
for(int i = 0; i < math.Pow(n, 2); i++) {
String poss = String.format("%*s", n, Integer.toBinaryString(i)).replace(' ', '0')
filePrintStream.print(poss);
}
这将按顺序生成所有可能的位串而不重复。
答案 1 :(得分:0)
该文件应包含:000001010011110或0001010011110? (同样的事情可以用于..1111 ......)
如果您知道要打印什么,那么您无需检查:
public static void main(String []args){
int n = 4;
print(n,0);
for (int i=0;i<n;i++){
print(i,1);
print(i,0);
}
print(n,1);
System.out.println("");
}
static void print(int max, int number){
for (int j=0;j<max;j++){
System.out.print(number);
}
}