假设您获得了以下接口:
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;
}
暂无答案!
目前还没有任何答案,快来回答吧!