9

質問で述べたように、配列内の (i,j) ペアの総数を見つける必要があります。

(1) **i<j** 
(2) **a[i]>a[j]**

ここで、i と j は配列のインデックスです。スペースの制約はありません。

私の質問は

 1) Is there any approach which takes less than O(N^2) time?
 2) if so what is least complexity ?
 3) How do we prove that ? 

質問が明確であることを願っています。

私のアプローチは次のとおりです

質問を行う 1 つの方法は、O(N^2) 時間かかるブルートフォアを使用することです。

しかし、この質問には、少なくとも O(NlogN) ソリューションのより最適化されたソリューションがあるはずだと思います。私の直感の理由は次のとおりです。

直感 1) For sorting an array in ascending order conditions we have are : for i<j , a[i]<a[j] which is similar to my question . I also read that sorting has lower bound of Omega(n log n) . So my question should also have Omega(n log n) . I may be completely wrong if so please correct me .

私の2番目の直感は次のとおりです。

次のような要素の配列があるとします: 4,9,7,3,2,1,8,12

i<j , a[i]>a[j] i=0 が 4 を指しているため、上記の要素 4の条件を計算します。j の可能な値は 3,4,5 です。a[0]>a[3],a[0]>a[4],a [0]>a[5] なので、現時点での (i,j) ペアの総数は 3 です。次回 i(index) を 1 にインクリメントすると、j の可能な値は 2,3,4,5,6 になります。しかし、i=0 の場合 (a[i]=4 の場合) は、a[i=0] よりも小さい要素が 3 つ計算され、これは a[i=1] よりも小さいという事実を使用する必要があります。 9 を 3,2,1 と比較してください (不要な計算を削除するため)。不要な計算を削除できれば、複雑さを O(N^2) 未満に減らすことができます。さもなければ、O(N^2) 未満の解は存在しません。しかし、解決策が存在する場合、どうすればよいでしょうか。グラフを作成しようとしましたが、私の努力は無駄です。

アプローチ 1)In-order to obtain O(nlogn) complexity I think we need to tweak around quick sort or merge sort to get solution but problem here is, if we sort the array we loose the actual positions of elements.

アプローチ 2)In-order to get solution in O(NlogN) time I think using tree we may get the optimised sollution . I didn't get any clue.

アプローチ 3)If there exists any O(N) time algorithm it should be with hashing . But in this case simple hashing doest work .

したがって、上記の直感またはアプローチのどれが正しいか教えてください(正しい場合、どのアプローチが最適化されたソリューションにどのようにつながるか)。

4

2 に答える 2

12

here で説明されているように、マージソートと同様に、アルゴリズムを使用して逆ペアをカウントできます。

アイデアは、各ステップでいくつの反転が変更されたかをカウントしながら、配列をマージソートすることです。


別のアプローチは、順序統計ツリーを使用することです。配列の要素をこのツリーに順番に挿入し、各挿入後に、挿入された要素の前に、それよりも大きい要素がいくつあるかを確認します。

order-statistics ツリーの代わりにIndexable skiplistがあります。


どちらのアルゴリズムも O(N log N) 時間の複雑さがあります。

反転のおおよその数を取得するには、いくつかの制限付きで O(N) 時間の複雑さが可能です。マージソートが変更されたのと同じ方法でバケットソートを変更できます。

バケット ソートの「散布」フェーズでは、バケットの最後に要素を挿入しながら、より大きな要素のバケット内の要素数を見積もる必要があります (各バケット内の要素は元の順序のままです)。

バケットの並べ替えの「並べ替え」フェーズでは、(同じ方法で) 並べ替えアルゴリズムを変更する必要があります (挿入並べ替えが最も可能性が高い)。要素を適切な場所に挿入する間、ジャンプした他の要素の数をカウントする必要があります。

制限として、このアルゴリズムは数値 (または数値に簡単に変換できるオブジェクト) でのみ機能し、これらの数値がどのように分布するかを事前に知っておく必要があります。したがって、一様に分散された整数の配列がある場合、このアルゴリズムは適切に機能するはずです。

于 2012-10-31T13:22:52.987 に答える
6

このようなペアは、配列内の反転数と呼ばれます。これは、配列がソートにどれだけ近いかを示す 1 つの尺度です。マージソートを変更して、O(nlogn) 時間で反転の数を効率的にカウントできます。詳しくはこちらをご覧ください。

于 2012-10-31T13:26:51.867 に答える