0% found this document useful (0 votes)
21 views

CountingInversion Full

The document describes an algorithm for counting inversions in a list. It uses a divide-and-conquer approach. It divides the list into two halves, recursively counts the inversions in each half, and then combines the results by counting inversions between elements in different halves, achieving an overall runtime of O(n log n).

Uploaded by

f20210467
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
21 views

CountingInversion Full

The document describes an algorithm for counting inversions in a list. It uses a divide-and-conquer approach. It divides the list into two halves, recursively counts the inversions in each half, and then combines the results by counting inversions between elements in different halves, achieving an overall runtime of O(n log n).

Uploaded by

f20210467
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 9

COUNTING INVERSION

Counting Inversions
• Sites tries to match your item (e.g. books) preferences with others.
– You rank n items.
– The site consults database to find people with similar tastes.
– Based on how you and they rate various things – it can recommend new things these other
people have liked.

• Similarity metric: number of inversions between two rankings.


– My rank: 1, 2, …, n.
– Your rank: a1, a2, …, an.
– items i and j inverted if i < j, but ai > aj.
Items A B C D E
ME 1 2 3 4 5 Inversions
YOU 1 3 4 2 5 3-2, 4-2

• Brute force: check all (n2) pairs i and j.


Counting Inversions: Divide-and-Conquer

• Divide-and-conquer.

1 5 4 8 10 2 6 9 12 11 3 7
Counting Inversions: Divide-and-Conquer

• Divide-and-conquer.
– Divide: separate list into two pieces.
1 5 4 8 10 2 6 9 12 11 3 7

Divide: O(1).

1 5 4 8 10 2 6 9 12 11 3 7
Counting Inversions: Divide-and-Conquer

• Divide-and-conquer.
– Divide: separate list into two pieces.
– Conquer: recursively count inversions in each half.
1 5 4 8 10 2 6 9 12 11 3 7

1 5 4 8 10 2 6 9 12 11 3 7

5 blue-blue inversions 8 red-red inversions


5-4, 5-2, 4-2, 8-2, 10-2 6-3, 9-3, 9-7, 12-3, 12-7, 12-11, 11-3,
11-7

Conquer: 2T(n / 2)
Counting Inversions: Divide-and-Conquer
• Divide-and-conquer.
– Divide: separate list into two pieces.
– Conquer: recursively count inversions in each half.
– Combine: count inversions where ai and aj are in different halves, and
return sum of three quantities
1 5 4 8 10 2 6 9 12 11 3 7

1 5 4 8 10 2 6 9 12 11 3 7

5 blue-blue inversions 8 red-red inversions


5-4, 5-2, 4-2, 8-2, 10-2 6-3, 9-3, 9-7, 12-3, 12-7, 12-11, 11-3,
11-7
9 blue-red inversions: 5-3, 4-3, 8-6, 8-3, 8-7, 10-6, 10-9, 10-3, 10-7
Total Inversion : 5 + 8 + 9 = 22
Counting Inversions: Combine
• Combine: count blue-red inversions
– Assume each half is sorted.
– Count inversions where ai and aj are in different halves.
– Merge two sorted halves A followed by B into sorted whole just as
done in merge sort
1 2 4 5 8 10 3 6 7 9 11 12

– Append the smaller of these two to the output list.


– If bj is the smaller element then
• Increment counter for inversion by the number of elements in A.
– Advance the pointer in the list from which the smaller element was
selected.
• T(n)  T  n/2 T  n/2  O(n)  T(n) O(nlogn)
Final Algo
Sort-and-Count(L) {
if list L has one element
there are no inversions
Else
Divide the list into two halves A and B
(rA, A)  Sort-and-Count(A)
(rB, B)  Sort-and-Count(B)
(r, L)  Merge-and-Count(A, B)
Endif
return r = rA + rB + r and the sorted list L
}
References

• Algorithm Design by Jon Kleinberg and Eva


Tardos, Pearson

You might also like