更新一系列对象的高效算法'性能

时间:2014-07-10 22:34:45

标签: java algorithm performance

(我不确定如何在标题中总结这个问题)

我有一个随机数量的A类对象,它们有几个属性,包括颜色。然后我收到一个随机数的B类对象,它们都具有color属性。我需要更新我的A类对象范围,以匹配B类对象的颜色属性和B类对象的数量。可以删除,创建或修改A类对象。值得注意的是,可能永远不会存在两个具有相同颜色的A类对象。

最简单的方法是删除所有A类对象,然后创建新对象(相同数量的B类对象)并设置每个新创建的类A对象的color属性以匹配相应的B类对象的color属性。但是 - 在性能方面,修改类A对象的颜色属性以匹配B类对象的颜色属性是一个巨大的胜利,而不是删除A类对象并创建新对象。

A类对象最初包含在地图中。 B类对象到达矢量。

我想知道是否有人认识到这个问题,并且知道某种优雅的设计模式?

1 个答案:

答案 0 :(得分:2)

未经测试的代码但应该有效。 Ir肯定会演示算法(不是模式)。

public void test() {
    // Start data.
    Map<String, A> asInAMap = new HashMap<>();
    // The B's arrive.
    List<B> arrivingBs = new ArrayList<>();
    // Grab the A's and key them on colour.
    Map<Colour, A> asInColour = new HashMap<>();
    // Keep track of all As.
    Set<A> availableAs = new HashSet<>(asInAMap.values());
    // Roll them into the Map.
    for (A a : availableAs) {
        // Key all A's by colour.
        asInColour.put(a.colour, a);
    }
    // Walk the Bs, matching up the A's
    Set<A> matchedAs = new HashSet<>();
    Set<B> unMatchedBs = new HashSet<>();
    for (B b : arrivingBs) {
        // Is there a matching A with the right colour?
        A aMatched = asInColour.get(b.colour);
        if (aMatched != null) {
            // Keep track of the ones that matched.
            matchedAs.add(aMatched);
        } else {
            // Keep track of all not-matched Bs.
            unMatchedBs.add(b);
        }
    }
    // Don't touch any of the matched ones.
    availableAs.removeAll(matchedAs);
    // Change colours of any A.s left.
    Iterator<B> bsWithNewColours = unMatchedBs.iterator();
    for (A changeAColour : availableAs) {
        if (bsWithNewColours.hasNext()) {
            B newB = bsWithNewColours.next();
            // Change a spare A's colour.
            changeAColour.colour = newB.colour;
            // Finished with that one.
            bsWithNewColours.remove();
        }
    }
    // All that are left in notMatched must generate new A's.
    for (B newColour : unMatchedBs) {
        // Make a new A with a non-matched colour.
        asInAMap.put(String.valueOf(newColour.colour), new A(newColour.colour));
    }
}

本质:

  1. 列出所有A
  2. 按颜色索引全部。
  3. 对于每个B,如果A存在相同的颜色,请将其标记为保持者。如果没有,请将其标记以备将来关注。
  4. 对于所有剩余不匹配的A,请将其颜色更改为其中一个标记的B的颜色,并取消标记B.
  5. 对于所有剩余的标记B,没有A匹配它的颜色,并且所有可用的A都已用完,因此为它们制作新的A#。