1 / 23

David Evans cs.virginia/evans

Class 12: Quickest Sorting. David Evans http://www.cs.virginia.edu/evans. Dandelion of Defeat by Mary Elliott Neal. Rose Bush by Jacintha Henry & Rachel Kay. by Kristina Caudle. CS150: Computer Science University of Virginia Computer Science. Insert Sort. (define (insertel cf el lst)

amy-weeks
Download Presentation

David Evans cs.virginia/evans

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Class 12: Quickest Sorting David Evans http://www.cs.virginia.edu/evans Dandelion of Defeat by Mary Elliott Neal Rose Bush by Jacintha Henry & Rachel Kay by Kristina Caudle CS150: Computer Science University of Virginia Computer Science

  2. Insert Sort (define (insertel cf el lst) (if (null? lst) (list el) (if (cf el (car lst)) (cons el lst) (cons (car lst) (insertel cf el (cdr lst)))))) (define (insertsort cf lst) (if (null? lst) null (insertel cf (car lst) (insertsort cf (cdr lst))))) insertsort is (n2)

  3. Divide and Conquer • Both simplesort and insertsort divide the problem of sorting a list of length n into: • Sorting a list of length n-1 • Doing the right thing with one element • Hence, there are always n steps • And since each step is  (n), they are  (n2) • To sort more efficiently, we need to divide the problem more evenly each step

  4. (define (insertsorth cf lst) (if (null? lst) null (insertelh cf (car lst) (insertsorth cf (cdr lst))))) Same as insertsort except uses insertelh Insert Halves (define (insertelh cf el lst) (if (null? lst) (list el) (let ((fh (first-half lst)) (sh (second-half lst))) (if (cf el (car fh)) (append (cons el fh) sh) (if (null? sh) (append fh (list el)) (if (cf el (car sh)) (append (insertelh cf el fh) sh) (append fh (insertelh cf el sh)))))))) (if (= (length lst) 1) (if (cf el (car lst)) (cons el lst) (list (car lst) el)) (let ((fh …

  5. append can’t be O(1) • Needs to make a new list of length n + m where n is the length of the first list, and m is the length of the second list • Making a list of length k requires k conses, so append must be (n + m)

  6. Experimental Confirmation > (testgrowthappend) n = 10000, m = 1, time = 0 n = 20000, m = 1, time = 0 n = 40000, m = 1, time = 0 n = 80000, m = 1, time = 10 n = 160000, m = 1, time = 10 n = 320000, m = 1, time = 40 n = 640000, m = 1, time = 70 n = 1280000, m = 1, time = 150 n = 2560000, m = 1, time = 290 (1.0 4.0 1.75 2.14286 1.9333) n = 10000, m = 10000, time = 0 n = 20000, m = 20000, time = 0 n = 40000, m = 40000, time = 0 n = 80000, m = 80000, time = 10 n = 160000, m = 160000, time = 50 n = 320000, m = 320000, time = 40 n = 640000, m = 640000, time = 70 n = 1280000, m = 1280000, time = 150 n = 2560000, m = 2560000, time = 270 (5.0 0.8 1.75 2.142857142857143 1.8)

  7. Complexity of Insert Half Sort (define (insertelh cf el lst) (if (null? lst) (list el) (if (= (length lst) 1) (if (cf el (car lst)) (cons el lst) (list (car lst) el)) (let ((fh (first-half lst)) (sh (second-half lst))) (if (cf el (car sh)) (append (insertelh cf el fh) sh) (append fh (insertelh cf el sh))))))) (define (insertsorth cf lst) (if (null? lst) null (insertelh cf (car lst) (insertsorth cf (cdr lst))))) log n applications of insertelh Each one is (n) work since append is (n) n applications of insertelh Complexity is:(n2log n)

  8. Making it faster • We need to either: • Reduce the number of applications of insertelh in insertsorth • Reduce the number of applications of insertelh in insertelh • Reduce the time for one application of insertelh Impossible – need to consider each element Unlikely…each application already halves the list Need to make first-half, second-half and append faster than (n)

  9. The Great Lambda Tree of Ultimate Knowledge and Infinite Power

  10. Sorted Binary Trees el left right A tree containing all elements x such that (cf x el) is true A tree containing all elements x such that (cf x el) is false

  11. Tree Example 3 5 cf: < 2 8 4 7 1 null null

  12. Representing Trees (define (make-tree left el right) (list left el right)) (define (get-left tree) (first tree)) (define (get-element tree) (second tree)) (define (get-right tree) (third tree)) left and right are trees (null is a tree) tree must be a non-null tree tree must be a non-null tree tree must be a non-null tree

  13. Trees as Lists (define (make-tree left el right) (list left el right)) (define (get-left tree) (first tree)) (define (get-element tree) (second tree)) (define (get-right tree) (third tree)) 5 2 8 1 (make-tree (make-tree (make-tree null 1 null) 2 null) 5 (make-tree null 8 null))

  14. insertel-tree (define (insertel-tree cf el tree) (if (null? tree) (make-tree null el null) (if (cf el (get-element tree)) (make-tree (insertel-tree cf el (get-left tree)) (get-element tree) (get-right tree)) (make-tree (get-left tree) (get-element tree) (insertel-tree cf el (get-right tree)))))) If the tree is null, make a new tree with el as its element and no left or right trees. Otherwise, decide if el should be in the left or right subtree. insert it into that subtree, but leave the other subtree unchanged.

  15. How much work is insertel-tree? Each time we call insertel-tree, the size of the tree. So, doubling the size of the tree only increases the number of calls by 1! (define (insertel-tree cf el tree) (if (null? tree) (make-tree null el null) (if (cf el (get-element tree)) (make-tree (insertel-tree cf el (get-left tree)) (get-element tree) (get-right tree)) (make-tree (get-left tree) (get-element tree) (insertel-tree cf el (get-right tree)))))) insertel-tree is  (log2n) log2a=b means2b=a

  16. insertsort-tree (define (insertsort cf lst) (if (null? lst) null (insertel cf (car lst) (insertsort cf (cdr lst))))) (define (insertsort-worker cf lst) (if (null? lst) null (insertel-tree cf (car lst) (insertsort-worker cf (cdr lst))))) No change…but insertsort-worker evaluates to a tree not a list! (((() 1 ()) 2 ()) 5 (() 8 ()))

  17. extract-elements We need to make a list of all the tree elements, from left to right. (define (extract-elements tree) (if (null? tree) null (append (extract-elements (get-left tree)) (cons (get-element tree) (extract-elements (get-right tree))))))

  18. Complexity of insertsort-tree (define (insertel-tree cf el tree) (if (null? tree) (make-tree null el null) (if (cf el (get-element tree)) (make-tree (insertel-tree cf el (get-left tree)) (get-element tree) (get-right tree)) (make-tree (get-left tree) (get-element tree) (insertel-tree cf el (get-right tree)))))) n = number of elements in tree (log n) n = number of elements in lst (define (insertsort-tree cf lst) (define (insertsort-worker cf lst) (if (null? lst) null (insertel-tree cf (car lst) (insertsort-worker cf (cdr lst))))) (extract-elements (insertsort-worker cf lst))) (n log n)

  19. Growth of time to sort random list n2 insertsort n log2n insertsort-tree

  20. Comparing sorts > (testgrowth simplesort) n = 250, time = 110 n = 500, time = 371 n = 1000, time = 2363 n = 2000, time = 8162 n = 4000, time = 31757 (3.37 6.37 3.45 3.89) > (testgrowth insertsort) n = 250, time = 40 n = 500, time = 180 n = 1000, time = 571 n = 2000, time = 2644 n = 4000, time = 11537 (4.5 3.17 4.63 4.36) > (testgrowth insertsorth) n = 250, time = 251 n = 500, time = 1262 n = 1000, time = 4025 n = 2000, time = 16454 n = 4000, time = 66137 (5.03 3.19 4.09 4.02) > (testgrowth insertsort-tree) n = 250, time = 30 n = 500, time = 250 n = 1000, time = 150 n = 2000, time = 301 n = 4000, time = 1001 (8.3 0.6 2.0 3.3)

  21. Can we do better? • Making all those trees is a lot of work • Can we divide the problem in two halves, without making trees? Continues in Lecture 13

  22. Charge • PS4 due Monday (1 week only!) • Next class: • Finishing quicksort • Understanding the universe is (n3) are there any harder problems?

More Related