Algorithmic Complexity!

 

fork and clone:

https://github.com/beth/algo-time-complexity-review

Plan

  • Overview of types of complexity
  • Strategy for determining complexity
  • Examples

Types of Complexity

Imagine you have an electronic copy of a directory of all past and present HR students (in alphabetical order, one student per page, with name, picture, current job, and cohort) and you want to print and mail a directory to each student. 

 

Problem size: # of students 

Major Types of Complexity

Constant: Increasing the problem size does not change the number of operations. 

 

O(1)
O(1)O(1)

Example: Given a directory and the page a student is on, determine the cohort of the student.

# of Students

# of Ops

5

10

200

400

2

2

2

2

Major Types of Complexity

Linear: The number of operations is proportional to problem size.

O(n)
O(n)O(n)

Example: Given a copy of the directory, make a list of everyone from cohort 21.

# of Students

# of Ops

100

200

350

700

 

100

200

350

700

Major Types of Complexity

Quadratic: The number of operations is proportional to the square of the problem size.

O(n^2)
O(n2)O(n^2)

Example: You printed all of the copies, but forgot to add page # and capitalize the first letter of everyone's first and last name. Correct each copy with a sharpie.

# of Students

# of Ops

5

10

12

24

5*15 = 75

10*30 = 300

12*36 = 432

24*72 = 1,728

Major Types of Complexity

Logarithmic: Multiplying the problem size by constant adds a the same number of operations.

O(log_c n)
O(logcn)O(log_c n)

Example: Given a name of a student, determine what cohort they are in (by dividing section of book in half repeatedly).

# of Students

# of Ops

8

16

128

256

3

4

7

8

log_c n
logcnlog_c n

How many times do I have to divide n by c to reach 1?

Major Types of Complexity

Exponential: The number of operations is proportional to some constant raised to the power of problem size. 

Example: You are sending a gift card to either blue bottle or chai bar to each student with the directory. You want to make a list of all the possible ways in which you can give out the gift cards.

Major Types of Complexity

Example: You are sending a gift card to either blue bottle or chai bar to each student with the directory. You want to make a list of all the possible ways in which you can give out the gift cards.

 

S1 B   B   B   B   C   C   C   C  
S2 B   B   C   C   B   B   C   C
S3 B   C   B   C   B   C   B   C
S1 B       B       C       C    
S2 B       C       B       C  
} 4 Ways  

S1 B B B B B B B B C C C C C C C C
S2 B B B B C C C C B B B B C C C C
S3 B B C C B B C C B B C C B B C C
S4 B C B C B C B C B C B C B C B C
} 8 Ways  

} 16 Ways  

2^2
222^2
2^3
232^3
2^4
242^4
} 32 Ways  

2^5
252^5
} 64 Ways  

2^6
262^6
5 students
6 students

Major Types of Complexity

Exponential: The number of operations is proportional to some constant raised to the power of problem size. 

O(c^n)
O(cn)O(c^n)

Example: You are sending a gift card to either blue bottle or chai bar to each student with the directory. You want to make a list of all the possible ways in which you can give out the gift cards.

# of Students

# of Ops

2

4

3

6

4

16

8

64

Major Types of Complexity

Determining Complexity

 

1. Determine what variable(s) represent problem size (this is n)

2. Write number of operations in terms of n

     - Lines in series are ADDED

     - Lines nested in other function calls or loops are MULTIPLIED

3. Find leading term and drop coefficients

 

What about?

1. Native JS methods (think about the time complexity of native method - how would you write it? check out the polyfill)

2. Recursive functions (draw a decision tree)

Determining Complexity

1. Determine what variable(s) represent problem size (this is n)

2. Write number of operations in terms of n

     - Lines in series are ADDED

     - Lines nested in other function calls or loops are multiplied 

3. Find leading term and drop coefficients

Example: Given a copy of the directory, make a list of everyone from cohort 21.

Algorithm

​for each page
  if cohort is 21
    add to list

 

 

0 or 1 

n + n
n+nn + n
2n
2n2n
O(n)
O(n)O(n)
n \times (1 + 1)
n×(1+1)n \times (1 + 1)

Determining Complexity

Example: You printed all of the copies, but forgot to add page # and capitalize the first letter of everyone's first and last name. Correct each copy with a sharpie.

Algorithm

​for each copy
  for each page in copy
    write page count
    capitalize first name
    capitalize last name
n 

 

 

n 


 
n \times (n \times (1 + 1 + 1))
n×(n×(1+1+1))n \times (n \times (1 + 1 + 1))
n \times (3n)
n×(3n)n \times (3n)
O(n^2)
O(n2)O(n^2)
1  
1  
1  
3n^2
3n23n^2

Determining Complexity

fork and clone:

https://github.com/beth/algo-time-complexity-review

example: contains

function contains(array, target){
  return array.indexOf(target) > -1;
}
function contains(array, target){

  function indexOf(){
    var index = -1;
    for (var i = 0; i < array.length; i++){
      if (array[i] === target){
        return index;
      }
    }
    return index;
  }

  return indexOf() > -1;

}

example: partialContains

function partialContains(array, target, start){
  return array.slice(start).indexOf(target) > -1;
}
function partialContains(array, target, start){
  var newArray = array.slice();
  var index = newArray.indexOf(target);
  return index > -1;
}

Example - countChar

function countChar(string){
  var counts = {};
  var currChar, currCharCount;
  for (var i = 0; i < string.length; i++){
    currChar = string[i];
    currCharCount = 1;
    for (var j = i+1; j < string.length; j++){
      if (currChar === string[j]){
        currCharCount++;
      }
    }
    if (!counts.hasOwnProperty(currChar)){
      counts[currChar] = currCharCount;
    }
  }
  return counts;
}
// do what is inside of here n times {
    // 1 operation  
    // 1 operation 
    // do what is inside of here (n-i) times {

      // worst case: 1 operation

    }

    // worst case: 1 operation 
  }
}

Example - countChar

\frac{1}{2}(n^2-n)
12(n2n)\frac{1}{2}(n^2-n)
// do what is inside of here n times {
    // 1 operation  
    // 1 operation 
    // do what is inside of here (n-i) times {

      // worst case: 1 operation

    }

    // worst case: 1 operation 
  }
}

}  

(n - i) * 1 

3 + (n - i)

1 

1 

1 

}  

3 + (n - 1)

 +  3 + (n - 2)

 +  3 + (n - 3)

 +  ...  + 3 + (n - n)

 3 + (n - 1)  +  3 + (n - 2)  +  3 + (n - 3)  +  ...  +  3 + (n - n)

 3n + (n-1 + n-2 + n-3 + ... + n-n) 

 3n + (sum of all numbers from 0 to n-1) 

 3n +

Example - factorial

factorial(5)

5*factorial(4)

4*factorial(3)

3*factorial(2)

2*factorial(1)

1

Example - tournament

function tournament(players){
  var results;
  if (players.length < 3){
    return players[0];
  } else {
    results = hotPotato(players); 
    return tournament(results);
  }
}
81 = 3^4
81=3481 = 3^4
27 = 3^3
27=3327 = 3^3
9 = 3^2
9=329 = 3^2
3 = 3^1
3=313 = 3^1
1 = 3^0
1=301 = 3^0

Example - allPasswords

3^1
313^1
3^2 + 3^1
32+313^2 + 3^1
3^3 + 3^2 + 3^1
33+32+313^3 + 3^2 + 3^1
O(c^{n})
O(cn)O(c^{n})

c = number of characters in alphabet

n = max number of characters in password

Example - quadTree

HR - Time Complexity Review

By Beth Johnson

HR - Time Complexity Review

  • 2,843