2017-04-22 2 views
0

나는 우리가 같은 모든 가능한 세 쌍의 단어를 얻을 수있는 방법자바에서 문자열에 가능한 모든 세 단어를 효율적으로 생성하는 방법은 무엇입니까?

string[] word = {"a", "good", "boy", "lives, here"} 

같은 문자열의 배열로있는 경우 : 현재

("a", "good", "boy") 
("a", "good", "lives") 
("a", "lives", "here") 
("good", "boy", "lives") 
("good", "lives", "here") 
("boy","lives", "here") 

, 나는 세 가지 루프

for (int i = 0; i < word.length - 2; i++) { 
    for (int j = i+1; j < word.length - 1; j++) { 
      for (int k = j+1; k < word.length ; k++) { 
      .... 
      ..... 

을 사용하고있는 중이 야 어떻게하면 더 효율적으로 할 수 있습니까?

+1

왜 이것이 효율적이지 않다고 생각하십니까? 가능한 조합을 정확히 한 번 생성하고 있습니다 ... – Imus

+0

배열의 모든 요소에 대한 순열이 필요합니다. 당신은 http://www.geeksforgeeks.org/write-ac-program-to-print-all-permutations-of-a-given-string/을 볼 수 있습니다. 이것은 문자열의 순열에 관한 것입니다. 배열 및 예 다른 코드에서 언급 한 코드가 너무 잘 맞습니다. –

+0

이 문자열 배열 대신 큰 텍스트 문서를 처리한다면 어떨까요? 저는 20K 라인의 텍스트를 말하고 각 라인에서 가능한 모든 3 단어를 찾는 것처럼 많은 양의 텍스트 라인을 처리하는보다 효율적인 방법을 찾고있었습니다. –

답변

1

여기서 큰 의미는 "효율적으로"의미하는 것에 달려 있습니다.

잠시 동안 나는 4 개의 입력 중에서 3 개의 단어를 조합하여 만드는 것이 단지 예일 뿐이라고 생각할 것입니다. 예를 들어, 5 개 입력 중 4 개 단어 조합 또는 10 개 중 8 개 조합 등 모든 결과 단어 및/또는 단어가 변경 될 때마다 코드를 완전히 다시 작성하지는 않습니다.

이 경우 우리는 "모든 조합을 생산하십시오"라고 생각할 수 있습니다. 중첩 루프는 기본적으로 0에서부터 자릿수의 몇 가지 제한까지 계산됩니다. 각 한도가 한계에 도달하면 롤오버가 0으로 넘어 가고 다음 숫자가 하나씩 증가합니다. 꽤 평범한 계산입니다. 일반적으로 우리는 밑이 10 인 것으로 계산하므로 숫자는 0에서 9로 이동 한 다음 0으로 롤오버하고 다음 숫자는 증가합니다. 이 경우 롤오버가되는 위치 (위의 경우 4)에 임의의 제한을 설정하기 만하면됩니다.

이렇게하면 숫자의 기준이 바뀌고 있습니다. Base 10은 0에서 9로 이동합니다. Base 8은 0에서 7로 넘어갑니다 (즉, 항상 base-1에서 0입니다).

위의 문제 때문에 0에서 일부 제한 (총 조합 수)을 계산해야합니다. 우리는 각각의 숫자를 기본 4 숫자로 변환해야합니다. 그런 다음 해당 기본 4 숫자의 각 자릿수를 입력 배열의 인덱스로 사용합니다.

int base = input.length; 
int digits = 3; 

int max = Math.pow(base, digits); 

for (int i=0; i<max; i++) { 
    string d = Integer.toString(i, base); 
    for (int j=0; j<digits; j++) { 
     int index = j < digits.length ? d[j] - '0' : 0; 
     // in[index] is the next result word 
    } 
    // end of one result set. 
} 
관련 문제