如何避免时间复杂度O(n ^ 2)?

时间:2013-06-15 07:55:00

标签: java loops collections time-complexity

我有以下这段代码:

for(ArticleBasketInBean basketBean : bean.getBasket()) {
    for(ArticleDTO article : dto.getArticleList()) {
        if(basketBean.getArticleReference().equals(article.getArticleReference())) {
            article.setAddedToBasket(true);
        }
    }
}

显然,上述操作的时间复杂度为O(n ^ 2)。对于这种情况,articleReference是唯一的。因此,bean.getBasket()返回的列表没有重复articleReference,对于dto.getArticleList()返回的列表也是如此。

我想避免这种嵌套迭代,并希望编写更快的代码。我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

当然,使用java.util.HashSet来缓存其中一组引用,假设这些集合不是太大。有了良好的哈希函数,这应该会让你回到O(n)。

答案 1 :(得分:1)

一个简单的break会救你。

    for(ArticleBasketInBean basketBean : bean.getBasket()) {
    for(ArticleDTO article : dto.getArticleList()) {
        if(basketBean.getArticleReference().
                                  equals(article.getArticleReference())) {
            article.setAddedToBasket(true);
            break;
        }
    }
}

答案 2 :(得分:1)

如果你没有太多的文章/篮子,并且你说参考文献是独一无二的,你可以做这样的事情;我们打电话给R参考类型,A文章类型,B购物篮的类型:

// since all references are unique we can use that, but see below
Map<R, A> mappedArticles = new IdentityHashMap<>();

// inject articles based on references in the map, then

A article;

for (B basket: bean.getBasket())
    article = mappedArticles.get(basket.getArticleReferences());
    if (article != null)
        article.setAddedToBasket(true);

// Full list of articles is in the map's .values()

注意:

  • 请注意使用身份哈希集;您可能希望为引用实现equals / hashcode(或者您使用的类型已经为您实现了它们);
  • 您的地图可能会被填充为“流经”的文章,在这种情况下,您只能创建一次(如果是这样,请将其设为线程安全!)。