2011-07-18 14 views
3

可能性の重複:
Counting inversions in an arrayプログラミング面接の質問(配列反転)

これは、私は数ヶ月前に開発者の仕事のために会社がインタビューされたときに私が持っていたプログラミングの質問です。 N個の整数の配列Aを考える

反転アレイのは、インデックスの任意のペアとして定義されている(a、b)は、その結果< BおよびA [B] < A [A]。

関数を書く:

int inversion_count(int A[], int n); 

Aに反転数を計算し、または-1を返し、そのような数が10億を超える場合があります。たとえば、次の配列

A[0]=-1 A[1]=6 A[2]=3 A[3]=4 A[4]=7 A[5]=4 

で4つの反転あります

(1,2) (1,3) (1,5) (4,5) 

はとても機能は4

を返す必要があり、私は非常に一般的な方法でこの問題を解決:ダブルループを使用して。

int i, j; 
long count; 
for (i = 0; i < n; i++) { 
    for (j = i+1; j < n; j++) { 
     if (A[i] > A [j]) count++; 
     if (count > 1000000000) break; // exit loop 
    } 
    if (count > 1000000000) break; // exit loop 
} 
if (count > 1000000000) return -1; 
else return count; 

したがって、実行時間は:O(nsquare)であり、効率的ではないと言われました。私は今、この問題を解決する別の方法を考えています。おそらくn log nアルゴリズムを使用していますが、私はまだそれを理解していません。何か案は?

+2

"N個の整数からなる配列Aが与えられた場合、その配列の逆は、aの"あなたは「???」を記入してください。あなたが文の終わりを落としたようです。 –

+0

あなたは '' N個の整数の配列Aを与えられ、配列の逆転はaのようなインデックス(a、b)の対であるという文を完成させるでしょうか? – pstrjds

+1

@Justin投稿を編集してくれたJustin Ethierに感謝します。私はシンボルよりも少なく、コードフォーマットとしてハイライトするのを忘れてしまったので、HTMLエンコーダはhtmlタグのように扱いました。ごめんなさい ! –

答えて

1

この回答はO(n log n)アルゴリズムについて説明しています:Counting inversions in an array

まず、ソート(O(n log n))をソートし、バイナリ検索を使用してO(n log n)という要素を見つけ、O(n log n)を求めます。

+1

詐欺であれば、投票を終了し、コピーしないで、回答を貼り付けてください。 – amit

+0

私は両方を行い、私の回答を編集し、代わりに要約を提供します。 – orlp

+0

ありがとう、私はそれを見ていたはずです。それについてお詫び申し上げます。 –