Download presentation
Presentation is loading. Please wait.
Published byΛήδα Ειδοθεα Γλυκύς Modified over 6 years ago
1
Runtime of MergeSort CSC 172 SPRING 2004 LECTURE 8
2
General No office hours for TFP on 2/11 Read Chapter 7
Project 2 is due Feb 18 You should have “insert term” working by now. If you don’t – do it. If you are stuck, see me or grad TAs immediately. How many students took MTH 150 Review of Induction? Review of Big-Oh? Review of recurrence relations?
3
Runtime Analysis of recursive code
We use T(n) to say “it takes ‘T(n)’ time for some method to run on input of size ‘n’” Sometimes, it’s simple T(n) = O(n^2) Usual analysis and proof techniques Sometimes, when recursion is involved we resort to a recurrence relation T(n) = O(f(n)) + T(g(n)) We need to solve the recurrence relation
4
Example public void prntlst(Node n1) { if (n1 != null) {
System.out.println(n1.getData()); prntlst(n1.getNext()); }
5
T(n) = O(1) + T(n-1) Example public void prntlst(Node n1) {
if (n1 != null) { System.out.println(n1.getData()); prntlst(n1.getNext()); } T(n) = O(1) + T(n-1)
6
Recurrence Relation BASIS: T(0) = O(1) INDUCTION: T(n) = O(1) + T(n-1)
7
Recurrence Relation BASIS: T(0) = O(1) INDUCTION: T(n) = O(1) + T(n-1)
To solve, let’s replace the O(1) with constants
8
Recurrence Relation BASIS: T(0) = a INDUCTION: T(n) = b + T(n-1)
To solve, let’s replace the O(1) with constants
9
Recurrence Relation Expansion
T(n) = b + T(n-1) So, T(n-1) = ?
10
Recurrence Relation Expansion
T(n) = b + T(n-1) So, T(n-1) = b + T(n-2) T(n) = b + b + T(n-2) T(n) = b + b + b + T(n-3) …. T(n) = n*b + T(0) T(n) = n*b + a
11
Recurrence Relation Expansion
Undo the replacement T(n) = n*b + a T(n) = n*O(1) + O(1) T(n) = O(n) + O(1) T(n) = O(n)
12
What is the RR for split? //O(1) //O(1) //O(1) //O(1) //O(1) //O(1)
public static Node split(Node head){ Node secondNode; if (head == null) return null; else if (head.getNext() == null) return null; else { secondNode = head.getNext(); head.setNext(secondNode.getNext()); secondNode.setNext(split(secondNode.getNext()); return secondNode; } //O(1) //O(1) //O(1) //O(1) //O(1) //O(1)
13
What is the RR for split? //O(1) //O(1) //O(1) //O(1) //O(1) //O(1)
public static Node split(Node head){ Node secondNode; if (head == null) return null; else if (head.getNext() == null) return null; else { secondNode = head.getNext(); head.setNext(secondNode.getNext()); secondNode.setNext(split(secondNode.getNext()); return secondNode; } //O(1) //O(1) //O(1) //O(1) //O(1) //O(1) //O(1) + T(n-2)
14
What is the RR for Merge? //O(1) //O(1) //O(1) //O(1) //O(1)
public static Node merge(Node list1, Node list2){ if (list1 == null) return list2; else if (list2 == null) return list1; else if (list1.getData.compareTo(list2.getData()) < 1) { list1.setNext(merge(list1.getNext(),list2); return list1; } else { list2.setNext(merge(list1,list2.getNext()); return list2; } //O(1) //O(1) //O(1) //O(1) //O(1)
15
What is the RR for Merge? //O(1) //O(1) //O(1) //O(1) //O(1)
public static Node merge(Node list1, Node list2){ if (list1 == null) return list2; else if (list2 == null) return list1; else if (list1.getData.compareTo(list2.getData()) < 1) { list1.setNext(merge(list1.getNext(),list2); return list1; } else { list2.setNext(merge(list1,list2.getNext()); return list2; } //O(1) //O(1) //O(1) //O(1) //O(1)
16
What is the RR for MergeSort?
public static Node mergeSort(Node list){ Node secondList; if (list == null) return null; else if (list.getNext() == null) return list; else { secondList = split(list); return merge(mergeSort(list),mergeSort(secondList)); } //O(1) //O(1) //O(1) //O(n)
17
What is the RR for MergeSort?
public static Node mergeSort(Node list){ Node secondList; if (list == null) return null; else if (list.getNext() == null) return list; else { secondList = split(list); return merge(mergeSort(list),mergeSort(secondList)); } //O(1) //O(1) //O(1) //O(n) What is the length of list? secondList? length(list) == length(secondList) = n/2
18
What is the RR for MergeSort?
public static Node mergeSort(Node list){ Node secondList; if (list == null) return null; else if (list.getNext() == null) return list; else { secondList = split(list); return merge(mergeSort(list),mergeSort(secondList)); } //O(1) //O(1) //O(1) //O(n) //O(n) What is the length of list? secondList? length(list) == length(secondList) = n/2 So, what is the cost of the call to merge?
19
What is the RR for MergeSort?
public static Node mergeSort(Node list){ Node secondList; if (list == null) return null; else if (list.getNext() == null) return list; else { secondList = split(list); return merge(mergeSort(list),mergeSort(secondList)); } //O(1) //O(1) //O(1) //O(n) //O(n) If the cost of mergeSort is TmergeSort(n): What is the cost of mergeSort is TmergeSort(list)? TmergeSort(secondlist)?
20
What is the RR for MergeSort?
public static Node mergeSort(Node list){ Node secondList; if (list == null) return null; else if (list.getNext() == null) return list; else { secondList = split(list); return merge(mergeSort(list),mergeSort(secondList) ); } //O(1) //O(1) //O(1) //O(n) //O(n) Tmergesort(n) = O(1)+O(n)+2Tmergesort(n/2)
21
What is the RR for MergeSort?
22
Recurrence Relation for MergeSort
Basis n == 0 TmergeSort(0) = O(1) Induction TmergeSort(n) = O(n) + 2TmergeSort(n/2)
23
Replace O(1)s by concrete constants
TmergeSort(1) = a TmergeSort(n) = bn + 2TmergeSort(n/2) TmergeSort(n)/n = b + TmergeSort(n/2)/(n/2) TmergeSort(n/2)/(n/2) = b + TmergeSort(n/4)/(n/4) TmergeSort(n/4)/(n/4) = b + TmergeSort(n/8)/(n/8) TmergeSort(n/8)/(n/8) = b + TmergeSort(n/16)/(n/16) … TmergeSort(2)/(2) = b + TmergeSort(1)/(1) How many calls?
24
How many calls? log2n calls
TmergeSort(n)/n = blog2n + TmergeSort(1)/(1) TmergeSort(n) = nblog2n + na TmergeSort(n) = O(nlog2n)
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.