Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| courses:cs211:winter2018:journals:boyese:chapter5 [2018/03/12 18:43] – [Section 5.2: Further Recurrence Relations] boyese | courses:cs211:winter2018:journals:boyese:chapter5 [2018/03/12 19:29] (current) – [Section 5.3: Counting Inversions] boyese | ||
|---|---|---|---|
| Line 52: | Line 52: | ||
| ====Section 5.3: Counting Inversions==== | ====Section 5.3: Counting Inversions==== | ||
| + | |||
| + | **Comparing rankings** | ||
| + | * To determine similarity of rankings we need a metric | ||
| + | * Similarity metric: number of inversions between two rankings | ||
| + | * My rank: 1, 2, …, n | ||
| + | * Your rank: a< | ||
| + | * Indices i and j are inverted if i < j but a< | ||
| + | * Geometric series | ||
| + | |||
| + | **Brute force solution** | ||
| + | * Look at every pair (i, j) and determine if they are an inversion | ||
| + | * Requires Θ(n< | ||
| + | * Note: already an efficient algorithm but we can try to improve on run time | ||
| + | |||
| + | **Divide and conquer** | ||
| + | * Assume number represents where item should be in the list, i.e., where it is in someone else’s list | ||
| + | * 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 | ||
| + | |||
| + | |||
| + | //Merging two sorted lists while also counting the number of inversions between them.// | ||
| + | |||
| + | < | ||
| + | Merge-and-Count(A, | ||
| + | Maintain a Current pointer into each list, initialized to point to the front elements | ||
| + | Maintain a variable Count for the number of inversions, initialized to 0 | ||
| + | While both lists are nonempty: | ||
| + | Let a< | ||
| + | Append the smaller of these two to the output list | ||
| + | If b< | ||
| + | Increment Count by the number of elements remaining in A | ||
| + | Endif | ||
| + | Advance the Current pointer in the list from which the smaller element was selected. | ||
| + | EndWhile | ||
| + | Once one list is empty, append the remainder of the other list to the output | ||
| + | Return Count and the merged list | ||
| + | </ | ||
| + | |||
| + | //The Sort-and-Count algorithm correctly sorts the input list and counts the number of inversions; it runs in O(n log n) time for a list with n elements.// | ||
| + | |||
| + | < | ||
| + | Sort-and-Count(L) | ||
| + | If the list has one element then there are no inversions | ||
| + | Else | ||
| + | Divide the list into two halves: | ||
| + | A contains the first [n/ | ||
| + | B contains the remaining [n/ | ||
| + | (r< | ||
| + | (r< | ||
| + | (r, L) = Merge-and-Count (A, B) | ||
| + | Endif | ||
| + | Return r = r< | ||
| + | </ | ||
