Big-O Flashcards

(48 cards)

1
Q

What is “Big-O” ?

A

The language and metric we use to describe the efficiency of algorithms.

Also called “Asymptotic Runtime”

Refers to how much time or space an algorithm will use, generally based on an input size “n”

It is a rough upper bound for worst cases and large inputs

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Common Big-O Runtimes

A
  • O(1) - Constant
  • O( log N ) - Logarithmic
  • O( N ) - Linear
  • O( N log N ) - Log Linear
  • O( N2 ) - Quadratic
  • O( N3 ) - Cubic
  • O( 2N ) - Exponential
  • O( N! ) - Factorial
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Which has the higher complexity?

O(N)

or

O( 1 )

A

O( N )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Which has the higher complexity?

O(N)

or

O( log N )

A

O( N )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Which has the higher complexity?

O(N)

or

O( N log N )

A

O( N log N )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Which has the higher complexity?

O(N log N)

or

O( 1 )

A

O( N log N )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Which has the higher complexity?

O(N2)

or

O( 1 )

A

O( N2 )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Which has the higher complexity?

O( N3 )

or

O( 1 )

A

O( N3 )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Which has the higher complexity?

O( 1 )

or

O( 2N )

A

O( 2N )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Which has the higher complexity?

O( N! )

or

O( 1 )

A

O( N! )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Which has the higher complexity?

O( log N )

or

O( N log N )

A

O( N log N )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Which has the higher complexity?

O( N2 )

or

O( log N )

A

O( N2 )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Which has the higher complexity?

O( log N )

or

O( N3 )

A

O( N3 )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Which has the higher complexity?

O( 2N )

or

O( log N )

A

O( 2N )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Which has the higher complexity?

O( log N )

or

O( N! )

A

O( N! )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Which has the higher complexity?

O( N )

or

O( N2 )

A

O( N2 )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Which has the higher complexity?

O( N3 )

or

O( N )

A

O( N3 )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Which has the higher complexity?

O( N )

or

O( 2N )

A

O( 2N )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Which has the higher complexity?

O( N! )

or

O( N )

A

O( N! )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Which has the higher complexity?

O( N log N )

or

O( N2 )

21
Q

Which has the higher complexity?

O( N3 )

or

O( N log N )

22
Q

Which has the higher complexity?

O( N log N )

or

O( 2N )

23
Q

Which has the higher complexity?

O( N log N )

or

O( N! )

24
Q

Which has the higher complexity?

O( N3 )

or

O( N2 )

25
Which has the higher complexity? O( N2 ) or O( 2N )
O( 2N )
26
Which has the higher complexity? O( N! ) or O( N2 )
O( N! )
27
Which has the higher complexity? O( 2N ) or O( N3 )
O( 2N )
28
Which has the higher complexity? O( N3 ) or O( N! )
O( N! )
29
Which has the higher complexity? O( 2N ) or O( N! )
O( N! )
30
Three Major Complexity Notations
_Big O_ * O( f(n) ) * Asymptotic Upper bounds * Algorithm AT LEAST that fast _Big Omega_ * Ω( f(n) ) * Asymptotic Lower Bounds * Algorithm will run AT MOST that fast _Big Theta_ * 𝚯( f(n) ) * Combines O and Theta * Indicates that algorithm is O( f(n) ) AND Ω( f(n) ) * Casual use of Big O often really means Big Theta
31
Three general Input Cases
* Best Case * Input is organized in a way that the algorithm runs at the fastest possible speed, with the lowest possible complexity * Example: Already sorted array into sorting algorithm * Worst Case * Input organized so that algorithm runs at the slowest speed possible, with the highest complexity * Example: Reverse sorted array into sorting algorithm * Expected/General Case * What the vast majority of real world input will look like
32
Two Types of Complexity
Time Complexity Space Complexity
33
Space Complexity
* The space (typically memory) used by an algorithm * Also described with Big O notation Example: * Array size n -\> O(n) * 2D Array size n x n -\> O(n2) * Call Stack: n recursive calls → O(n)
34
Space Complexity: Recursion vs Iterative(loops)
Space Complexity only increases when memory is being used simultaneously. * Recursive calls increase complexity, because they add to the stack * Loops(Iterative) do not increase complexity, memory in the scope of the loop is destroyed each iteration
35
General Formulation of Big O (steps)
1. Describe the Worst Case Input 2. Step through the algorithm, add or multiply runtime of sections 3. Simplify by dropping constants: 1. O(2n) = O(n) 4. Further simplify by only using the most dominant(fastest growing) term: 1. O(n2 + n) = O(n2) 5. Consider for each type of operation 6. Simplify amortized cost
36
Types of Code Sections and their Complexity
Code Section Type Complexity Sequential Instruction O( 1 ) Single Pass through Array/Set O( n ) Distinct Sequential Loops (e.g. two separate arrays) O(A + B) Nested Loops O(A \* B) Elements Halved (eg Binary Search) O( log n ) Recursive Function with Multiple calls O(branchesdepth)
37
Complexity of Code Section Types: Sequential Instruction
O(1) Constant
38
Complexity of Code Section Types: Single Pass through Array/Set
O( n ) Linear
39
Complexity of Code Section Types: Distinct Sequential Loops
O( A + B) Where A and B are the number of iterations in two distinct loops
40
Complexity of Code Section Types: Nested Loops
O( A \* B) Where B is the loop nested inside of loop A
41
Complexity of Code Section Types: Elements halved (eg Binary Search)
O( log N) Logarithmic
42
Complexity of Code Section Types: Recursive Function w/ multiple calls
O( branchesdepth) Ex: O( 2N )
43
Multipart Algorithms: What is the complexity of this code: for( a : array A) {} for( b : array B) {}
In this case, Add the complexity: O( A + B)
44
Multipart Algorithms: What is the complexity of this code: for( a : array A) { for( b : array B) {} }
Nested Loop: Multiply O( A \* B)
45
Special Case: Amortized Time
It allows us to describe that a worst case happens every once in a while. But once it happens, it won't happen again for so long that the cost is "amortized". A costly operation that happens infrequently can effectively be ignored, especially if it becomes less frequent over time. eg A Dynamic ArrayList doubles it's capacity when capacity is reached. Normal insertions are O(1), but insertion with growth is O(N). The Amortized Time is O(1)
46
O( log N ) Runtimes: Explanation
Log N comes from repeatedly halving an array or set. One example is Binary Search. The total runtime is then a matter of how many steps (dividing N by 2 each time) we can take until N becomes 1. N/2 + N/4 +...+N/2k At one element: 2k = N and k is our number of steps So, k = log2N In Big O, the base of log doesn't matter as the growth rate is similar, so it's just O(log N)
47
Recursive Runtimes: Explanation
The runtime is the sum of each level of recursion. For a function: f(n) { return f(n-1) + f(n-1) } Each level branches twice: 2n + 2n-1 + ... + 21 + 20 = 2n+1 + 1 Applying reductions: O(2n+1 + 1) = O(2n)
48
Recursive Runtimes: Call Tree
A technique for modeling recursive functions, each node on the tree represents a call or stack frame. Used with a table to count the number of calls per node. Runtime is the sum of each level of recursion