java - 是否可以使这个嵌套 for 循环小于 O(N^2)?

标签 java apache-kafka big-o

我正在使用 Apache Spark 2.1 和 Java 8 开发 Kafka Streaming 服务。我使用嵌套的 for 循环来使用主题/分区对填充 ArrayList

是否可以使用另一种方法来减少 O(N^2) 的嵌套 for 循环?

这是代码:

    private static List<TopicAndPartition> createTAndPList(List<String> topics, List<String> partitions)
        throws ConsumerException {
    if (topics.size() != partitions.size()) {
        throw new ConsumerException("Cannot create list with unequal number of topics and parititons,");
    }

    List<TopicAndPartition> topicsAndPartitions = new ArrayList<>();
    for (int t = 0; t < topics.size(); t++) {
        for (int p = 0; p < Integer.parseInt(partitions.get(t)); p++) {
            topicsAndPartitions.add(new TopicAndPartition(topics.get(t), p));
        }
    }

    return topicsAndPartitions;
}

仅供引用:由于我无法控制(管理)的权力,我无法使用 Kafka 8 以上版本。

最佳答案

使用您给定的代码,看起来不可能减少订单。

但是,您可以进行两个小的优化。

  • topics.get(t) 移出内部 for 循环,

  • 不要在每次循环时重新计算内部 for 循环终止条件。

    for (int t = 0; t < topics.size(); t++) {
        String topic = topics.get(t);
        int count = Integer.parseInt(partitions.get(t));    
        for (int p = 0; p < count; p++) {
            topicsAndPartitions.add(new TopicAndPartition(topic, p));
    

您正在调用 topics.getInteger.parseInt(partitions.get(t)) t*p 次,而不是仅仅 t 次。 topic.get() 的更改可能不会有太大作用,但像这样将某些内容移出内循环是一种非常常见的优化。

最后,您真的需要将它们全部放在一个列表中吗?或者您可以在实际需要的地方动态生成它们吗?

关于java - 是否可以使这个嵌套 for 循环小于 O(N^2)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46306129/

相关文章:

java - 在android中隐藏按钮上的文字?

java - 为什么这个 O(N^2) 算法运行得这么快?

c - 需要说明算法的时间复杂度解法

c# - Kafka主题有消息时如何触发azure函数

big-o - 为什么乘法是 n^2 次?

java - 改变 Set<?> 中的值

java - 登录注册android应用程序无法连接到本地服务器(连接被拒绝)

java - 关闭 Play Framework 2 中的 MemCachedClient 日志记录

java - 为什么 httpcomponents 在第一次处理元组后会减慢我的拓扑速度?

bigdata - 如果 kafka 的一个副本宕机以跟上复制因子,kafka 会创建一个新的追随者吗