180 likes | 325 Views
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, ...)
E N D
CSCE 2100: Computing Foundations 1Analyzing 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, ...) • Simple assignment • Calls to library functions (scanf, printf, ... )
Simple For-Loops [1] • Constant time for assignment • Neglect checking for loop condition etc (constant time) • Loop is executed times executed times ⇒ for(inti=0; i<n; i++) A[i]=0;
Simple For-Loops [2] for(inti=0; i<n; i++) for(intj=0; j<n; j++) A[i][j]=0; • Neglect checking for loop condition etc. (constant time) • Inner loop: • The inner loop is executed n times executed times ⇒ O(n2)
Analyzing if statements if(<condition>) <then part> else <else part> • 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-else example if(A[1][1] == 0) for(inti=0; i<n; i++) for(intj=0; j<n; j++) A[i][j]=0; else for(inti=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)
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(intj=i+1; j<n; j++) if(A[j] < A[small]) small = j;
Selection Sort [1] for(inti=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?
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
Complex Loop Example n = A.size() i= 0; while(x != A[i] && i < n) i++; • The loop is at most executed times • The upper bound on the loop is
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
Example [1] main(){ inta, n; scanf("%d", &n); a = foo(0,n); printf("%d", bar(a,n)); } int bar(int x, int n){ for(inti=1; i<=n; i++) x += i; returnx; } intfoo(int x, intn){ for(inti=1; i<=n; i++) x += bar(i,n); return x; }
foo main bar Example [2] main(){ inta, n; scanf("%d", &n); a = foo(0,n); printf("%d", bar(a,n)); } int bar(int x, int n){ for(inti=1; i<=n; i++) x += i; returnx; } 1. Check for recursion(direct or indirect) intfoo(int x, intn){ for(inti=1; i<=n; i++) x += bar(i,n); return x; }
foo main bar Example [3] main(){ inta, n; scanf("%d", &n); a = foo(0,n); printf("%d", bar(a,n)); } int bar(int x, int n){ for(inti=1; i<=n; i++) x += i; returnx; } intfoo(int x, intn){ for(inti=1; i<=n; i++) x += bar(i,n); return x; } 2. Running time of bar O(n)
foo main bar Example [4] main(){ inta, n; scanf("%d", &n); a = foo(0,n); printf("%d", bar(a,n)); } int bar(int x, int n){ for(inti=1; i<=n; i++) x += i; returnx; } intfoo(int x, intn){ for(inti=1; i<=n; i++) x += bar(i,n); return x; } 3. Running time of foo O(n2) O(n)
foo main bar Example [5] main(){ inta, n; scanf("%d", &n); a = foo(0,n); printf("%d", bar(a,n)); } int bar(int x, int n){ for(inti=1; i<=n; i++) x += i; returnx; } intfoo(int x, intn){ for(inti=1; i<=n; i++) x += bar(i,n); return x; } 4. Running time of main O(n2) O(n2) O(n)
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.