java—如何有效地减少必须检查所有可能组合排列的项集合?

rqdpfwrv  于 2021-07-14  发布在  Java
关注(0)|答案(0)|浏览(258)

假设您获得了以下接口:

public interface Item {
    boolean canCombine(Item other);

    Item combine(Item other);

两个项目可以合并并减少为一个项目,如果 Item.canCombine(other) 返回true。
给定这些可以合并的项的集合,如何有效地减少集合,以便合并每个可以合并的项。编辑:如果两个项目组合在一起,并且其中任何一个项目可以与另一个项目组合,则该组合可以与另一个项目组合(a和b是可组合的,b和c是可组合的,那么ab和c是可组合的)。
我的尝试是使用一个队列,弹出第一个项目并将其用作累加器。然后我循环遍历其余的集合,并将所有匹配项与累加器组合起来,然后移除它们。最后,我将累加器放在队列的末尾,这样可以进一步减少它。这是o(n^2)或者更糟。我怀疑有更有效的解决办法。

static Collection<Item> reduce(Deque<Item> items) {
        Item accumulator;
        var noMatches = new ArrayList<Item>();
        while ((accumulator = items.pollFirst()) != null) {
            boolean matched = false;
            for (Iterator<Item> otherIterator = items.iterator(); otherIterator.hasNext(); ) {
                Item next = otherIterator.next();
                if (accumulator.canCombine(next)) {
                    accumulator = accumulator.combine(next);
                    otherIterator.remove();
                    matched = true;
                }
            }
            if (matched) {
                items.addLast(accumulator);
            } else {
                noMatches.add(accumulator);
            }
        }
        items.addAll(noMatches);
        return items;
    }

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题