java - 创建一个包含0和1的所有可能组合的文本文件(大小为n)

时间:2017-04-07 16:27:11

标签: java algorithm file combinations

我通过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)时,它会变得更糟。 我该怎么做才能让它更快?

感谢您的帮助。

2 个答案:

答案 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);
        }
    }