This is an old revision of the document!


Section 5.1: A First Recurrence: The Mergesort Algorithm

Divide and Conquer Algorithms

  • Process
    • Break up problem into several parts
    • Solve each part recursively
    • Combine solutions to sub-problems into overall solution
    • Use recurrences to analyze the runtime of divide and conquer algorithms
  • Approaches to Solving Recurrences
    • Unroll recursion
      • Look for patterns in runtime at each level
      • Sum up running times over all levels
    • Substitute guess solution into recurrence
      • Check to make sure it works
      • Prove that it works using induction on n

Merge Sort

  • Analyzing Merge Sort
    • General Template:
      • Break up problem of size n into two equal parts of size 1/2n → O(1)
      • Solve two parts recursively → T(n/2) + T(n/2)
      • Combine two solutions into overall solution → O(n)
    • Definition: T(n) = the number of comparisons to merge sort an input of size n
      • Recurrence relation: T(n) = 2T(n/2) + O(n)
        • T(n) =T(n/2) + c
      • Cost of each level in the tree is c*n
        • log n levels
      • Run time = log n

Section 5.2: Further Recurrence Relations

Binary Search

  • Analyzing the algorithm
    • Instead of recursively solving 2 problems, solve q problems
      • Size of problems is still n/2
    • Combining solutions is still O(n)
    • Recurrence relation:
      • For some constant c, T(n) ≤ qT(n/2) + cn when n > 2 and T(2) < c
  • Unroll the recurrence
    • T(n) = T(n/2) + c
      • Constant work at each level
      • Number of levels = log n
      • So the runtime is O(log n)
    • The case of q > 2
      • First level: qT(n/2) + cn
      • Next level: qT(n/4) + c(n/2)
      • qk problems at level k
      • size: n/2k
      • Number of levels: log n
        • Each level takes qk * c * (n/2k) = (q/2)icn
      • Overall run time: O(nlog q)

Section 5.3: Counting Inversions

Merge-and-Count(A,B)
    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<sub>i</sub> and b<sub>j</sub> be the elements pointed to by the Cuwent pointer
        Append the smaller of these two to the output list
        If b<sub>j</sub> is the smaller element then
            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
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/2](ceiling) elements
            B contains the remaining [n/2](floor) elements
        (r<sub>A</sub>, A) = Sort-and-Count (A)
        (r<sub>B</sub>, B) = Sort-and-Count (B)
        (r, L) = Merge-and-Count (A, B)
    Endif
    Return r = r<sub>A</sub> + r<sub>B</sub> + r, and the sorted list L

Section 5.4: Finding the Closest Pair of Points

Section 5.5 Integer Multiplication

Section 5.6: Convolutions and the Fast Fourier Transform

courses/cs211/winter2018/journals/boyese/chapter5.1520880695.txt.gz · Last modified: by boyese
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0