Создавайте возможные пары независимо от порядка в неопределенном наборе значений

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

например, скажем, набор A, B, C, D, E

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

AB AC AD AE BC CD DE

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

Например

ABC ABD ABE BCD BCE

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

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


person Community    schedule 09.06.2009    source источник
comment
Вы не упомянули об этом, но из вашего вопроса я предполагаю, что вы хотели бы, чтобы каждый элемент в наборе использовался только один раз, например, в наборе A, B, C, D, E: AAAA не является допустимой парой?   -  person Ryan Guill    schedule 09.06.2009
comment
Считаете ли вы ABCDE подходящим элементом в вашем наборе или нет?   -  person Tetsujin no Oni    schedule 09.06.2009
comment
Почему вы назвали это так и перечислили сравнение в виде тега? Вы создаете набор мощности, чтобы проверить, есть ли в нем конкретный набор строк или нет? Если это так, возможно, есть более эффективные методы получения этой информации.   -  person Bert F    schedule 10.06.2009
comment
привет спасибо за ответ. В основном у меня есть большой набор данных, которые я категоризировал. эти данные состоят из лиц, и каждый человек может иметь такие категории, как публикации, место рождения или обучение в бакалавриате. теперь каждая категория может иметь одно или несколько значений. например, кто-то может учиться на бакалавриате из Нью-Йорка и Берлина. Я хочу выбрать любое поле, которое я хочу (или все) из тысяч, которые существуют для всех людей в моей базе данных, и попытаться определить любые отношения между ними. поэтому, если кто-то выберет 5 полей для моего, я хочу, чтобы программа искала любую комбинацию   -  person    schedule 11.06.2009


Ответы (4)


Похоже, вы хотите создать набор мощности. Этот вопрос по сути тот же, ответы ищите там.

person Michael Borgwardt    schedule 09.06.2009
comment
отличный! это именно то, что я искал. мне просто нужно создать функцию в потоке, чтобы попытаться найти любой набор из заданного большего набора значений! :: D - person ; 11.06.2009

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

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

person Zack Marrapese    schedule 09.06.2009

Вы хотите создать своего рода набор мощности перестановок вашего ввода.

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

Но какое отношение ваш вопрос имеет к сравнению?

person Dario    schedule 09.06.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); }
}
person Tetsujin no Oni    schedule 09.06.2009