プライオリティキューを使用してソートされたリストのリストのIterator

マクシム・ドミトリエフ:

私は、次の面接の質問を見つけたここに。

SortedIteratorは - 各リストのソートされたint型の値を持つリストのリストで構成されています。あなたは)次の(を呼び出すときに、次のソート値を与える必要があります。

次* *コンストラクタメソッドを実装する必要がある()*のhasNext()

[1、4、5、8、9]、[3、4、4、6]、[0,2]、[8]]

次の() - > 0、1、2、3、4、4、4 ...

私はJavaで迅速な実装を書きました:

package com.app;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class SortedIterator implements Iterator<Integer> {

    private final List<Integer> mFlattenedList;
    private final Iterator<Integer> mIntegerIterator;

    SortedIterator(final List<List<Integer>> lists) {
        mFlattenedList = flattenLists(lists);
        mIntegerIterator = mFlattenedList.iterator();
    }

    private List<Integer> flattenLists(final List<List<Integer>> lists) {
        final List<Integer> result = new ArrayList<>();
        for (List<Integer> list : lists) {
            for (int value : list) {
                result.add(value);
            }
        }
        Collections.sort(result);
        return result;
    }

    @Override
    public boolean hasNext() {
        return mIntegerIterator.hasNext();
    }

    @Override
    public Integer next() {
        return mIntegerIterator.next();
    }
}

時間:O(K * N)は、平坦化リスト= O(N * K)を反復処理するためにリスト+ O(N * K)の入力リストを平坦化します

スペース:O(N * K)が平坦化されたリストを格納します。

N - リストの数。

K - 各リスト内の要素の数。

しかし、その答えのリンクからは言います:

プライオリティキューを使用して、時間の複雑さO(logN個)での解決策があります。たぶん、インタビュアーがそのような何かを期待し、私は知りません。

どのようにO (log N)可能?プライオリティキューを使用する場合、我々は呼び出すたびは、hasNext()キューが空の場合、我々は(チェックする必要がありますO(1))。その後、我々は、呼び出しnext()キュー(からの分要素を抽出するO(log (N*K)に応じて)任意の実装のための)テーブル私たちが呼び出す必要があるので、next()N * K回、それが私たちを取るO(N * K * log (N*K)すべての要素を反復処理します。

pkpnd:

ソリューションのO(logN個)複雑複雑である要素ごとではなく、すべての値を反復処理するために複雑。

解決策は次のようになります。

  • ファーストと呼ばれる新しいクラスの定義ListValue値を格納するだけでなく、それがどこから来たのリストのインデックスということを。これらは、他に匹敵する必要がありますListValue値を使用してオブジェクト。

  • コンストラクタ:初期化PriorityQueue<ListValue>と呼ばれるpqとにNリストのそれぞれから最初の要素を配置しますpq

  • 次の():ポップListValueの目の前でpq値内部が返される値であるが、第一、それから、次の要素を移動するListValueにのリストpq私たちは一つの要素を削除し、1つの要素を追加するので複雑さは、O(Nを記録)でpq、ほとんどのN個の要素に含まれています、。

解決策は、Nリストのそれぞれから、一度にプライオリティキューにのみ、単一の「次」の値を、すべてのN * Kの値を保持しないことに注意してください。したがって、プライオリティキューは、その操作は全てOであるように、(Nログ)、(最大で)を有するN常時要素。

なぜこれが作品を理解するために、リコールは、各リストがすでにソートされているので、最小の未使用の値が(すでに消費された値は含まない)いくつかのリストの「前」に指定する必要があります。次に、プライオリティキューが正確に各リストの「前」の要素を含むことに注意してください-私たちは中に行われるように強制しnext()、我々はに要素を追加するときpq、我々は削除要素と同じリストから。したがって、常時pq(全ての値が使い果たされるまで)最小の未使用値を含むであろう。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=182175&siteId=1