あなたが話しているアルゴリズムは、おそらく時間と空間の複雑さを持つことはできませんO(N^2)
。以下に私の分析を指定しました。
アルゴリズム 1 - 複雑度: O(M N^2 log (M N^2))
これはあなたが説明したアルゴリズムです。
1) マトリックスを反復処理し、各配列を 1 つの配列にプルします。O(M*N^2)
すべての要素をコピーするには時間がかかります。
2) その後、この配列をソートします。ソートできる最も速いのは ですO(M*N^2 log (M*N^2))
。
したがって、全体の時間計算量は になりますO(M*N^2 log (M*N^2))
。
アルゴリズム 2 - 複雑度: O(M N^2 × log M N)
n-way マージのアルゴリズムから適応
- プライオリティ キューを作成する
- MxN 配列の各配列を反復処理します
- 最初の値を優先キーとして使用して、ペア (nextNumberIn({i,j}th array), {i,j}) をキューに入れます
- キューが空でない間
number
キューの先頭 ( , {i,j}) をデキューする
- 出力
number
- {i,j} 番目の配列が枯渇していない場合
- enqueue (nextNumberIn({i,j}番目の配列), {i,j})
プライオリティ キューへの要素の追加は対数時間で実行できるため、項目 2 はO(M*N × log M*N)
です。while ループの (ほぼすべての) 反復で要素が追加されるため、while ループ全体は になりますO(M*N^2 × log M*N)
。ここで、M*N^2 は並べ替える要素の総数です。
ステップ 3 の複雑さが支配的であるため、全体的な時間の複雑さは になりますO(M*N^2 × log M*N)
。
スペースの複雑さ
上記の両方のアルゴリズムで、スペースの複雑さはO(M*N^2)
、新しい配列を格納するために最小になります。それに加えて、アルゴリズム #1O(log (M*N^2))
では並べ替えステップに約追加のスペースが必要ですが、アルゴリズム #2O(M*N)
ではプライオリティ キュー用に追加のスペースが必要です。