2016-10-13 1 views
0

아래 입력에 대해이 오류가 발생했습니다. 다른 코드를 제안하십시오.나는 abcdefghijklmnopqrstuvwxyz 및 7의 입력에 대해 작동하지 않는 특정 길이의 문자열의 순열을 생성하기위한 코드를 가지고 있습니다.

abcdefghijklmnopqrstuvwxyz 
7 

오류 :

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 
at java.lang.StringBuilder.toString(Unknown Source) 
at aaa.c.generateCombination(c.java:24) 
at aaa.c.generateCombination(c.java:24) 
at aaa.c.generateCombination(c.java:24) 
at aaa.c.generateCombination(c.java:24) 
at aaa.c.generateCombination(c.java:24) 
at aaa.c.generateCombination(c.java:24) 
at aaa.c.generateCombination(c.java:24) 
at aaa.c.main(c.java:37) 

그것을 위해 노력하고 있습니다 :

abcdefghijklmnopqrstuvwxyz 
5 

패키지 AAA;

import java.util.LinkedList; 
import java.util.List; 
import java.util.Scanner; 

class c { 
    static int c; 
    List<String> permutations = new LinkedList<String>(); 
    Scanner sc=new Scanner(System.in); 
    String input =sc.nextLine(); 
    int conbinationSize = sc.nextInt(); 
    boolean[] isChoosed = new boolean[input.length()]; 
    public void generateCombination(String partialOutput) { 
     if (partialOutput.length() == conbinationSize) { 
      permutations.add(partialOutput); 
      c++; 
      return; 
     } 
     for (int i = 0; i < input.length(); ++i) { 
      if (!isChoosed[i]) { 
       isChoosed[i] = true; 
       generateCombination(partialOutput + input.charAt(i)); 
       isChoosed[i] = false;  
      } 
     } 
    } 

    void printCombination() { 
     for (String c : permutations) { 
      System.out.println(c);   
     } 
    } 
    public static void main(String[] args) { 
     c dfs = new c(); 
     dfs.generateCombination(""); 
     dfs.printCombination(); 
     System.out.println(c); 
    } 
} 
+1

깊은 재귀, 디버거를 시작하고 재밌게 보내십시오 :) – Shadov

+0

@Whatzs '깊은'재귀 깊이를 호출하지 않겠습니다. –

답변

1

크기가 5 인 경우 26 * 25 * 24 * 23 * 22 = 7 893 600 문자열을 목록에 넣습니다.

크기가 7 인 경우 26 * 25 * 24 * 23 * 22 * ​​21 * 20 = 3 315 312 000 문자열을 목록에 넣으려고합니다. 각 문자열은 7 자의 배열을 가지므로 약 34 바이트입니다. 실행했을 때 Java VM에 100GB를 할당 했습니까?

실제로 생성자/반복자를 사용하여 조합 및 순열을 생성하고 메모리에 저장하는 대신 조합에 저장하는 대신 저장하거나 스트림에 쓰는 것이 좋습니다. .

+0

감사합니다. –

관련 문제