2017-09-19 16 views
0

私はApache Spark 2.1とJava 8を使用してKafkaストリーミングサービスを行っています。にトピック/パーティションのペアを埋め込むためにネストされたforループを使用します。このネストされたforループをO(N^2)未満にすることは可能ですか?

別の方法論を使用して、このネストされたforループをO(N^2)から減らすことはできますか?ここで

コードです:

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; 
} 

はFYI:(管理)私が原因私のコントロールを超えたパワーにカフカ8の上方に使用することを防止しています

+0

このコードは多く呼び出されますか?これがちょうどいくつかのデータを初期化していて、一度起こるならば、私はちょうどこのまっすぐなアプローチに行きます。 –

+0

各ネストされたループは1つの要素をリストに追加するので、すべての要素を追加する必要がない場合を除いて、複雑さを減らす方法を提案していません。 – assylias

+2

正しい結果がN^2要素のArrayListであれば、それを満たすのにO(n^2)が必要です。 – Assafs

答えて

3

自分の与えられたコードでは、それが可能に見えません順序を減らす。

しかし、2つの小さな最適化を行うことができます。

  • 移動topics.get(t)は、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))をトンの* pを呼び出す回だけではなくトン回されています。 topics.get()の変更はおそらくあまり効果がありませんが、このような内部ループから何かを移動することは、かなり一般的な最適化です。

最後に、実際にすべてのリストが必要ですか?または、実際に必要な場所で動的に生成できますか?

+0

内部ループから '' Integer.parseInt(partitions.get(t)); ''を動かす良い点。残念ながら私はリストのすべての要素が必要です。 – Jeremy

関連する問題