running times continued
play

Running times continued - some running times are more difficult to - PowerPoint PPT Presentation

Running times continued - some running times are more difficult to analyze Merging two sorted lists Merging two sorted lists Input: Two arrays A = {a 1 , a 2 , , a m }, B = {b 1 , b 2 , , b n }, in increasing order in increasing order


  1. Running times continued - some running times are more difficult to analyze Merging two sorted lists Merging two sorted lists Input: Two arrays A = {a 1 , a 2 , …, a m }, B = {b 1 , b 2 , …, b n }, in increasing order in increasing order Array C containing A ∪ B, in increasing order Output:

  2. Running times continued Merging two sorted lists Two arrays A = {a 1 , a 2 , …, a m }, B = {b 1 , b 2 , …, b n }, Input: i in increasing order i i d Array C containing A ∪ B, in increasing order y g g Output: p MERGE(A,B) Running time ? g 1. i=1; j=1; k=1; 2. a m+1 = ∞ ; b n+1 = ∞ ; 3. while (k ≤ m+n) do 4. . if (a i < b j ) then (a i b j ) t e 5. c k =a i ; i++; 6. else 7 7. c =b ; j++; c k =b j ; j++; 8. k++; 9. RETURN C={c 1 , c 2 , …, c m+n }

  3. Running times continued Sorting An array X = {x 1 , x 2 , …, x n } Input: X sorted in increasing order Output:

  4. Running times continued Sorting An array X = {x 1 , x 2 , …, x n } Input: X sorted in increasing order Output: MergeSort – a divide-and-conquer algorithm MERGESORT(X,n) ( , ) 1. if (n == 1) RETURN X 2. middle = n/2 (round down) 3 3. A = {x 1 , x 2 , …, x middle } A = {x x x } 4. B = {x middle+1 , x middle+2 , …, x n } 5. As = MERGESORT(A,middle) 6. Bs = MERGESORT(B,n-middle) 7. RETURN MERGE(As,Bs)

  5. Running times continued Sorting An array X = {x 1 , x 2 , …, x n } Input: X sorted in increasing order Output: MergeSort Running time ? Running time ? MERGESORT(X,n) ( , ) 1. if (n == 1) RETURN X 2. middle = n/2 (round down) 3 3. A = {x 1 , x 2 , …, x middle } A = {x x x } 4. B = {x middle+1 , x middle+2 , …, x n } 5. As = MERGESORT(A,middle) 6. Bs = MERGESORT(B,n-middle) 7. RETURN MERGE(As,Bs)

  6. A recurrence Running time of MergeSort: T(n) How to bound T(n) ? -> “unrolling the recurrence”

  7. A recurrence Running time of MergeSort: T(n) How to bound T(n) ? -> “substitution / induction”

  8. More on sorting Other O(n log n) sorts ? Can do better than O(n log n) ?

  9. More on sorting HeapSort - underlying datastructure: heap Def: A heap is a complete binary tree, with nodes storing keys, and the property that for every parent and child: key(parent) ≤ key(child).

  10. More on sorting HeapSort - underlying datastructure: heap Use: priority queue – a datastructure that supports: - extract-min - add key - change key value

  11. More on sorting Heap Parent - stored in an array – how to compute: Left child Right child - how to add a key ? y

  12. More on sorting Heap Parent(i) = i/2 - stored in an array – how to compute: LeftChild(i) = 2i RightChild(i) = 2i+1 - how to add a key ? y HEAPIFY-UP(H,i) 1. while (i > 1) and (H[i] < H[Parent(i)]) do 1 while (i > 1) and (H[i] < H[Parent(i)]) do 2. swap entries H[i] and H[Parent(i)] 3. i = Parent(i) ADD(H,key) 1 1. H.size++ H size++ 2. H[H.size] = key 3. HEAPIFY-UP(H,H.size)

  13. More on sorting Heap Parent(i) = i/2 - stored in an array – how to compute: LeftChild(i) = 2i RightChild(i) = 2i+1 - what if we change the value of a key (at position i) ? g y ( p ) - if key decreased, then: - otherwise ? - otherwise ?

  14. More on sorting Heap Parent(i) = i/2 - stored in an array – how to compute: LeftChild(i) = 2i RightChild(i) = 2i+1 - what if we change the value of a key (at position i) ? g y ( p ) HEAPIFY-DOWN(H,i) 1. n = H.size 2. while (LeftChild(i)<=n and H[i] > H[LeftChild(i)]) or (RightChild(i)<=n and H[i] > H[RightChild(i)]) do 3. if (H[LeftChild(i)] < H[RightChild(i)]) then 4. j = LeftChild(i) 5. else 6. j = RightChild(i) 7 7. swap entries H[i] and H[j] swap entries H[i] and H[j] 8. i = j

  15. More on sorting Heap - running times: Use: priority queue – a datastructure that supports: - extract-min - add key - change key value

  16. More on sorting HeapSort HEAPSORT(A) 1 1. H = BUILD_HEAP(A) H BUILD HEAP(A) 2. n = A.length 3. for i=1 to n do 4. A[i] = EXTRACT_MIN(H) BUILD HEAP(A) _ ( ) EXTRACT MIN(H) _ ( ) 1. initially H = ∅ 1. min = H[1] 2. n = A.length 2. H[1] = H[H.size] 3 3. for i=1 to n do for i=1 to n do 3 3. H.size-- H size-- 4. ADD(H,A[i]) 4. HEAPIFY_DOWN(H,1) 5. RETURN min Note (more efficient BUILD_HEAP ): A different implementation of BUILD_HEAP runs in time O(n).

  17. More on sorting HeapSort HEAPSORT(A) 1 1. H = BUILD_HEAP(A) H BUILD HEAP(A) 2. n = A.length 3. for i=0 to n-1 do 4. A[i] = EXTRACT_MIN(H) BUILD HEAP(A) _ ( ) EXTRACT MIN(H) _ ( ) 1. initially H = ∅ 1. min = H[0] 2. n = A.length 2. H.length-- 3 3. for i=0 to n-1 do for i=0 to n-1 do 3 3. H[0] = H[H.length] H[0] = H[H length] 4. ADD(H,A[i]) 4. HEAPIFY_DOWN(H,0) 5. RETURN min Running time :

  18. Related datastructures

  19. A lower-bound on sorting:  (n log n) Every comparison-based sort needs at least  (n log n) comparisons, thus it’s running time is  (n log n).

  20. Sorting faster than O(n log n) ? We know: Every comparison-based sort needs at least  (n log n) comparisons. i Can we possibly sort faster than O(n log n) ? p y ( g )

  21. Sorting faster than O(n log n) ? RadixSort – a non-comparison based sort. Idea: First sort the input by the last digit Idea: First sort the input by the last digit.

  22. Sorting faster than O(n log n) ? RadixSort – a non-comparison based sort. RADIXSORT(A) 1. d = length of the longest element in A 2. for j=1 to d do 3. COUNTSORT(A,j) // a stable sort to sort A // b // by the j-th last digit th j th l t di it COUNTSORT (A,j) 1. let B[0..9] be an array of (empty) linked-lists 1 0 9 2. n = A.length 3. for i=0 to n-1 do 4 4. let x be the j th last digit of A[i] let x be the j-th last digit of A[i] 5. add A[i] at the end of the linked-list B[x] 6. copy B[1] followed by B[2], then B[3], etc. to A Running time ?

  23. Sorting faster than O(n log n) ? RadixSort – a non-comparison based sort. Idea: First sort the input by the last digit Idea: First sort the input by the last digit.

  24. Sorting faster than O(n log n) ? RadixSort – a non-comparison based sort. RADIXSORT(A) 1. d = length of the longest element in A 2. for j=1 to d do 3. COUNTSORT(A,j) // a stable sort to sort A // b // by the j-th last digit th j th l t di it COUNTSORT (A,j) 1. let B[0..9] be an array of (empty) linked-lists 1 0 9 2. n = A.length 3. for i=1 to n do 4 4. let x be the j th last digit of A[i] let x be the j-th last digit of A[i] 5. add A[i] at the end of the linked-list B[x] 6. copy B[1] followed by B[2], then B[3], etc. to A Running time ?

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend