この質問は前に説明したことがわかりましたが、私はバイナリインデックス付きツリーを使用してこれを行うことに興味があります。私はそれを行う方法を示すために thisリンクを見つけました。私は説明にかなり従っていませんでした。誰かが私になぜ以下のことが当てはまるのか説明してください。BITを使用して反転をカウントする
Create a BIT of size greater than n(no of elements). Iterate through array A (
let j be the index of loop),and for each element A[j] do:
1) Add j-sum(A[j]) to the number of inversions
2) add(A[j], 1) (i.e. add 1 to the position A[j] on BIT. This effectively
counts the number of time value A[j] is seen so far)
これはなぜ機能しないのですか。
どうもありがとう!! – frodo
偉大な答え。しかし、1つのこと:質問に「j sum(A [j])」が追加される理由が質問されます。私は 'sum(A [j])'は "0とA [j]の間にある今までに見たAの要素の数"を意味します。その場合、これまでの* A [j]以下の要素の総数です。これまでの*その他の要素はすべてjより大きくなければなりません。いくつありますか?配列が0ベースの場合は、j(j-1)個ある必要があります。したがって、これらのより大きい要素の 'j-sum(A [j])'がこれまでに存在しなければなりません。 (これは 'j == sum(A [n])'から 'sum(A [n]) - sum(A [j])'と同じです。 –