csce 2100: computing foundations 1 analyzing iterative programs
DESCRIPTION
CSCE 2100: Computing Foundations 1 Analyzing Iterative Programs. Tamara Schneider Summer 2013. Running Time of Simple Statements. Primitive operations in O(1) Arithmetic operations (+, %, *, -, ...) Logical operations (&&, ||, ...) Accessing operations (A[ i ], x->y, ...) - PowerPoint PPT PresentationTRANSCRIPT
CSCE 2100: Computing Foundations 1
Analyzing Iterative Programs
Tamara SchneiderSummer 2013
2
Running Time of Simple Statements
Primitive operations in O(1)– Arithmetic operations (+, %, *, -, ...)– Logical operations (&&, ||, ...)– Accessing operations (A[i], x->y, ...)– Simple assignment – Calls to library functions (scanf, printf, ... )
3
Simple For-Loops [1]
• Constant time for assignment • Neglect checking for loop condition etc
(constant time)• Loop is executed times
executed times ⇒
for(int i=0; i<n; i++) A[i]=0;
4
Simple For-Loops [2]
• Neglect checking for loop condition etc. (constant time)
• Inner loop: • The inner loop is executed n times
executed times ⇒ O(n2)
for(int i=0; i<n; i++) for(int j=0; j<n; j++)
A[i][j]=0;
5
Analyzing if statements
• Evaluation of condition takes a constant number of primitive operations ⇒
• Assume if-part has upper bound
• Assume else-part has upper bound ⇒
• Whether or is larger may depend on the input size
if(<condition>) <then part>else <else part>
6
If-else exampleif(A[1][1] == 0) for(int i=0; i<n; i++) for(int j=0; j<n; j++)
A[i][j]=0; else for(int i=0; i<n; i++) A[i][i] = 0;
• If-part: 2 nested loops executed times each; loop body is O(n) O(n2) total.
• Else-part: 1 loop executed times; loop body is O(n) total
• Safe upper bound: O(n2)
7
Inner Loop of Selection Sort
• The loop body takes time O(1)• The loop is executed times– The loop starts at – The loop’s condition becomes false for – The loop increment is 1
• ⇒ O(n-i-1)
for(int j=i+1; j<n; j++) if(A[j] <
A[small]) small = j;
8
Selection Sort [1]for(int i=0; i<n-1; i++){ small = i; for(int j=i+1; j<n; j++)
if(A[j] < A[small])
small = j; int temp = A[small];
A[small] = A[i]; A[i] = temp;
} //for
How often is this block executed?
𝑛−𝑖−1
9
Selection Sort [2]
10
Complex Loops
• Some loops do not specify explicitly how many times the loop body is executed
– while, do-while, some for-loops
• Analyze loop to find upper bound on number of iterations
• May need to prove statement by induction
11
Complex Loop Example
• The loop is at most executed times• The upper bound on the loop is
n = A.size()i = 0;
while(x != A[i] && i < n) i++;
12
Programs with Function Calls
• If function call is non-recursive– Analyze function separately– Add cost of function to block
• Function calls are a condition of while- or do-while loop– Add cost of function to block
13
Example [1]
main(){ int a, n; scanf("%d", &n); a = foo(0,n); printf("%d",
bar(a,n));}
int bar(int x, int n){ for(int i=1; i<=n; i+
+) x += i; return x;
}
int foo(int x, int n){ for(int i=1; i<=n; i++) x += bar(i,n); return x;}
14
Example [2]
1. Check for recursion(direct or indirect)
main
bar
foo
main(){ int a, n; scanf("%d", &n); a = foo(0,n); printf("%d",
bar(a,n));}
int bar(int x, int n){ for(int i=1; i<=n; i+
+) x += i; return x;
}
int foo(int x, int n){ for(int i=1; i<=n; i++) x += bar(i,n); return x;}
15
Example [3]
2. Running time of bar
main
bar
foo
O(n)
main(){ int a, n; scanf("%d", &n); a = foo(0,n); printf("%d",
bar(a,n));}
int bar(int x, int n){ for(int i=1; i<=n; i+
+) x += i; return x;
}
int foo(int x, int n){ for(int i=1; i<=n; i++) x += bar(i,n); return x;}
16
Example [4]
3. Running time of foo
main
bar
foo
O(n)
O(n2)
main(){ int a, n; scanf("%d", &n); a = foo(0,n); printf("%d",
bar(a,n));}
int bar(int x, int n){ for(int i=1; i<=n; i+
+) x += i; return x;
}
int foo(int x, int n){ for(int i=1; i<=n; i++) x += bar(i,n); return x;}
17
Example [5]
4. Running time of main
main
bar
foo
O(n)
O(n2)O(n2)
main(){ int a, n; scanf("%d", &n); a = foo(0,n); printf("%d",
bar(a,n));}
int bar(int x, int n){ for(int i=1; i<=n; i+
+) x += i; return x;
}
int foo(int x, int n){ for(int i=1; i<=n; i++) x += bar(i,n); return x;}
18
Summary
• Primitive operations are considered to have a constant running time.
• Analyzing simple loops makes use of the number of iterations and the cost of the loop body.
• To analyze complex loops the “worst case” may need to be assumed.
• Analyzing conditional statement involves using the “worst case”.
• Non-recursive functions can be analyzed independently.