2009-06-09 5 views
2

내가 알아 내려고하는 것은 무한한 값 집합의 순서와 관계없이 가능한 쌍을 만드는 알고리즘입니다. 이제 세트는 A, B, C, D라고하자 예무한한 값 집합에서 순서와 관계없이 가능한 쌍을 만듭니다.

, E

후 가능한 세트는

AB AC AD AE BC CD DE

하지만 ... 나는 또한 2 개 이상의 값 쌍을 원합니다. 예

ABC ABD ABE BCD BCE

아니라 ABCD 또는 ABCE. 여기에서 문제는 내가 문자열로 된 문자열 배열 []을 가진 메소드를 만들고 싶고 출력은 2,3의 쌍으로 된 문자열리스트가 될 것이라는 것입니다. 값의 수 -1까지.

누군가 해결책을 생각하면 도움이된다면. :)

+0

당신이 언급하지 않았다,하지만 난에 예를 들어, 당신은 세트의 각 항목을 한 번 사용하려는 경우에만 것입니다 귀하의 질문에서 가정 세트 A, B, C, D, E : AAAA는 유효한 쌍이 아닙니다? –

+0

ABCDE는 세트의 적절한 요소 또는 아닌가요? –

+0

왜 이런 방식으로 제목을 짓고 "비교"를 태그로 사용 했습니까? 특정 문자열 세트가 포함되어 있는지 여부를 테스트하기 위해 powerset을 생성하고 있습니까? 그렇다면 정보를 얻는 데보다 효율적인 후유증이있을 수 있습니다. –

답변

0

이것은 가장 많은 계산 집약적 인 작업 중 하나입니다. 이것은 원격으로 많은 데이터 세트로도 잘 확장되지 않습니다.

무기한 세트에는 실제로 실용적이지 않습니다. 생성 될 수있는 쌍을 제한 할 수 있으므로이 축척을 더 좋게 만들 수 있습니다.

5

power set을 구성하려는 것 같습니다. This question은 본질적으로 동일하므로 답변을 찾으십시오.

+0

위대한! 그게 정확히 내가 찾고 있었던거야. 난 그냥 주어진 값의 큰 집합에서 어떤 집합을 찾으려고 스레드에서 함수를 만들 필요가! ::디 –

0

입력하려는 내용이 power set 일종의 입력 순열입니다.

Java의 iterator concept은 이론적으로 무한 시퀀스를 허용합니다.

과 어떤 관련이 있습니까?과 비교하면 어떻습니까?

0

가장 효율적인 아니지만, 해결책 :

import java.util.Arrays; 
import java.util.Collection; 
import java.util.HashSet; 
import java.util.Set; 

public class PowersetTest { 

public static void main(String [] args){ 
    Set<Set<String>> sets = permute(Arrays.asList("a","b","c","d","e")); 
    for (Set<String> item : sets){ 
     System.out.printf("Set: %s%n", item.toString()); 
    } 
} 
    static public <T> Set<Set<T>> permute (Collection<T> items){ 
     Set<Set<T>> result = new HashSet<Set<T>>(); 
     for (final T item : items){ 
     Set<T> subsetElements = filter(items, new Predicate<T>(){public boolean apply(T f){ return (f!=item);}}); 
     if (subsetElements.size() > 0) { 
      result.addAll(permute(subsetElements)); 
     } 
     Set<T> temp = new HashSet<T>(); 
     temp.addAll(items); 
     result.add(temp); 
     } 
     return result; 
    } 

    static public <T> Set<T> filter(Collection<T> items, Predicate<T> filter){ 
    Set<T> result = new HashSet<T>(); 
    for (T item : items){ 
     if (filter.apply(item)) { 
     result.add(item); 
     } 
    } 
    return result; 
    } 

    public interface Predicate<T>{ public boolean apply(T item); } 
} 
관련 문제