Создание возможных пар независимо от порядка в неопределенном наборе значений - PullRequest
2 голосов
/ 09 июня 2009

То, что я пытаюсь выяснить, - это алгоритм, который будет создавать возможные пары независимо от порядка в неопределенном наборе значений.

например, допустим, набор A, B, C, D, E

тогда возможные наборы

AB переменный ток ОБЪЯВЛЕНИЕ AE До нашей эры CD DE

но ... я также хочу пары из более чем 2 значений.

например

ABC ABD ABE BCD BCE

но также ABCD или ABCE. Проблема здесь в том, что я хочу создать метод с входным массивом Strings STring [], а на выходе будет список строк в паре от 2,3 .... до числа значений -1.

Если у кого-то есть мысль о решении, пожалуйста, помогите. :)

Ответы [ 4 ]

5 голосов
/ 09 июня 2009

Кажется, вы хотите построить блок питания . Этот вопрос по сути тот же, ищите ответы.

0 голосов
/ 09 июня 2009

Не самое эффективное, но решение:

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); }
}
0 голосов
/ 09 июня 2009

То, что вы хотите создать, это какой-то блок питания перестановок вашего входа.

Концепция Java * теоретически допускает бесконечные последовательности.

Но как ваш вопрос связан с сравнением ?

0 голосов
/ 09 июня 2009

Это одна из самых интенсивных вычислительных операций, которые вы могли бы сделать. Это не будет хорошо масштабироваться при наличии даже большого набора данных.

Это действительно не практично для неопределенных наборов. Вы можете ограничить количество пар, которые могут быть сгенерированы, и, следовательно, сделать этот масштаб лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...