【问题标题】:Create possible pairs irrespective of order in a indefinite set of values在不确定的一组值中创建可能的对,而不考虑顺序
【发布时间】:2009-06-09 18:01:25
【问题描述】:

我想弄清楚的是一种算法,它可以创建可能的对,而不管在一组不确定的值中的顺序如何。

例如,假设集合是 A,B,C,D,E

那么可能的集合是

AB 交流电 广告 AE 公元前 光盘 德

但是...我也想要超过 2 个值的对。

例如

ABC ABD 安倍 BCD 公元前

还有 ABCD 或 ABCE。这里的问题是我想创建一个方法,输入一个字符串数组 STring[],输出将是一对 2,3.... 的字符串列表,最多值-1。

如果有人有解决方案的想法,请提供帮助。 :)

【问题讨论】:

  • 您没有提到这一点,但我从您的问题中假设您只希望集合中的每个项目都使用一次,例如在集合 A、B、C、D、E 中: AAAA 不是有效配对?
  • 你认为 ABCDE 在你的集合中是不是一个合适的元素?
  • 你为什么要这样命名,并把“比较”列为标签?您是否生成 powerset 以测试特定字符串集是否在其中?如果是这样,可能会有更有效的启发式方法来获取该信息。
  • 嗨,感谢您的回答。基本上我有一大组我已经分类的数据。该数据由个人组成,每个人可能具有出版物或出生地或本科学习等类别。现在每个类别可能有一个或多个值。例如,某人可能在纽约和柏林进行了本科学习。我想要的是从我的数据库中存在的数千个所有人中选择我希望(或全部)的任何字段,并尝试挖掘他们之间的任何关系。所以如果有人选择 5 个字段来挖掘,那么我希望程序搜索任何组合

标签: java compare set


【解决方案1】:

您似乎想构造一个power setThis question 本质上是一样的,在那里寻找答案。

【讨论】:

  • 太棒了!这正是我想要的。我只需要在线程中创建一个函数来尝试从给定的更大值集中找到任何集合! ::D
【解决方案2】:

这是您可以做的计算量最大的事情之一。即使是远程大型数据集,这也无法很好地扩展。

对于不定集来说真的不实用。您可以限制可以生成的对,从而使这种规模更好。

【讨论】:

    【解决方案3】:

    您想要创建的是某种power set 的输入排列。

    Java 的iterator concept 理论上允许无限序列。

    但是您的问题与比较有什么关系?

    【讨论】:

      【解决方案4】:

      不是最有效的,而是一种解决方案:

      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); }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-16
        • 1970-01-01
        • 1970-01-01
        • 2020-04-21
        • 1970-01-01
        • 2012-02-20
        • 2013-04-18
        相关资源
        最近更新 更多