SlideShare a Scribd company logo
1 of 35
Download to read offline
1
Recurrence, recursive function, divide-and-conquer approach
Review:
A function is recursive if it is defined in terms of itself.
Recursive part: by following
this recursion, the value of
f(n) can be calculated by
making progress towards the
base case
f(4) = f(3) + 4
= f(2) + 3 +4
= f(1) + 2 + 7
= 1 + 9
= 10
Base case: value of f(n) is known
Two components of a recursion
Q: How to find a “closed form” for f(n)?
(how to solve it?)
(non-recursive formula)
e.g. f(n)=
1 n=1
f(n-1)+n n>1
Let n be positive integers
Outcome (1) and (3): How to analyze recursive algorithms?
Will teach an algortihm design technique.
2
Remarks:
1)  Then, formally prove it by MI.
f(n) = f(n-1) + n
= f(n-2) + (n-1) + n
= …..
= f(1) + 2 + 3 + … + n
= n(n+1)/2
One simple approach: The Iteration Method
e.g. f(n)=
1 n=1
f(n-1)+n n>1
MI proof (sketch)
Base: when n = 1, f(n) = 1 by definition.
n(n+1)/2 = 1, so f(n) = n(n+1)/2 is true.
Induction: for n = k,
f(k) = f(k – 1)+k by definition
= (k-1)k/2 + k by hypothesis
= k(k+1)/2.
2) Sometimes we only need to
know the solution in asymptotic
notation.
3
f(n) = f(n-1) + n
= f(n-2) + (n-1) + n
= …..
= n(n+1)/2
e.g. f(n)=
1 n=1
f(n-1)+n n>1
If we only need to show that
f(n) = O(n2), we only need to
prove f(n) ≤ cn2 for some
constant c for n ≥ 1 using MI.
Step 1: try to get the value of c (do it in rough paper)
For the induction to go through,
f(n) = f(n-1) + n ≤ c(n-1)2 + n = cn2 – (2cn – c – n).
Since we want f(n) ≤ cn2, so we set 2cn – c – n ≥ 0
⇒ c ≥ n/(2n-1) where n/(2n-1) ≤ 1 for n ≥ 1
So, we can set c = 1.
Step 2: formal proof
We will show that f(n) ≤ n2 for all n ≥ 1.
Base:….
Induction: ….
Take-home exercise:
Prove f(n) = O(n): f(n) = 3 for n = 1, otherwise f(n) = f(n-1) + 10.
4
Alg(n) {
if (n = 1) return 1;
temp = Alg(n-1);
for (i = 1 to n)
temp = temp + 1;
return temp;
}
Let f(n) be the running time of
Alg(n).
e.g. f(n)=
c1 n=1
f(n-1)+c2n n>1
where c1 and c2 are constants
To analyze a recursive algorithm,
(1)  we model the running time of the algorithm as a
recursive function, then
(2)  solve the recursive function to get the answer in
asymptotic notation.
The time complexity of Alg(n) is O(n2).
5
Solving recurrences (obtain the asymptotic bounds on the
solution)
[MIT, ch4.3] substitution method
[MIT, ch4.4] recursion-tree method
[MIT, ch4.5] master method
Can you learn it yourself or let me know later if you
want a tutorial [will NOT be a main topic in the exam]?
Or you can get related material from web or any
related reference books
6
Divide-and-conquer approach usually gives a recursive
algorithm and the time complexity of the algorithm is
usually formulated as a recursive function. Solving the
recursive function will give the time complexity of the
algorithm.
Ø Divide problem into subproblems
Ø Conquer subproblems recursively
Ø Combine subproblem solutions
Simple example: calculate n!
Let f(n) = n!,
then f(1) = 1 and f(n) = n*f(n-1)
fact(n){
if (n = 1) return 1;
else return n*fact(n-1);
}
Let T(n) be the running time of fact(n)
Then, T(n) =
c1 if n=1
T(n-1)+c2 if n>1
where c1,c2 are constants
T(n) = T(n-1)+c2
= T(n-2)+c2+c2
= …..
= T(1) + (n-1)c2 = c1 + (n-1)c2
= O(n)
7
Review: Tower of Hanoi
Given 3 pegs and n disks of different sizes placed in an
increasing order of size on one peg, transfer the disks from
the original peg to another peg such that:
- only one disk can be moved in each step
-  in each peg, the disks must be in increasing order of size
1 2 3
How?
8
Solve it recursively:
Base case: if there is only one disk.
1 2 3
move disk from peg 1 to peg 3
Assuming that we know how to move n-1 disks,
can we solve it for n disks?
9
1 2 3
Move top (n-1) disks from peg 1 to peg 2
1 2 3
Move the largest disks from peg 1 to peg 3
1 2 3
Move (n-1) disks from peg 2 to peg 3
10
TofH(A,B,C,n) // source peg: A, destination peg: C
{
if (n=1)
move disk from A to C
else {
TofH(A,C,B,n-1);
move disk from A to C;
TofH(B,A,C,n-1);
}
}
What is the number of moves?
Let f(n) be the number of moves
f(n) = 1 n=1
2f(n-1)+1 n>1
f(n) = 2f(n-1) + 1
= 2(2f(n-2)+1) + 1 = 22f(n-2) + 2 + 1
= 22(2f(n-3)+1) + 2 + 1 = 23f(n-3) + 22 + 2 + 1
= ….
= 2n-1f(1) + 2n-2 + … + 2 + 1
= 2n-1 + 2n-2 + … + 2 + 1
= 2n - 1
How about time
complexity of
the algorithm?
To call the program:
TofH(1, 2,3, 3) // 3 disks
11
Review: Divide-and-conquer approach
(1)  In order to obtain a solution for input size n, we assume
the solution(s) for smaller n (subproblem) is available,
then construct the final solution from these solutions.
E.g. computing n! (assuming (n-1)! is available)
E.g. solving the Tower of Hanoi with n disks
(assuming we know how to do (n-1) disks)
(2) Don’t forget the base case:
E.g. n! = 1 when n = 1
E.g. Solving the Tower of Hanoi problem with 1 disk
(3) Derive a “recursive” algorithm from this idea.
(4) Capture the running time of the algorithm by a
recursive function, then solve the recurrence for the time
complexity of the algorithm.
Pay attention to the subproblem definition =>
12
A student tries to solve the Tower of Hanoi problem
recursively as follows: Assume that we know how to
move n/2 disks (n: even for simplicity)
TofH2(A,B,C,n) // source peg: A, destination peg: C
{
if (n=1)
move disk from A to C
else {
TofH2(A,C,B,n/2); // move 1st half from A to B
TofH2(A,B,C,n/2); // move 2nd half from A to C
TofH2(B,A,C,n/2); // move 1st half from B to C
}
}
Is it correct?
Q: to solve this problem, is 2n – 1 the minimum
number of moves?
** Definition: TofH(A,B,C,n): move n disks from A to C with B
empty or having disks with the correct order & all larger than
the given n disks.
13
Example: Find the largest number from a given set of n
numbers using divide-and-conquer approach
Divide the problem into subproblems
1)  Solve base cases for subproblems
2)  Assume that solutions of subproblems are
available, combine them to find the solution for
the original problem
There may be more than one way to define the subproblems.
Recall that for the problem of Tower of Hanoi:
problem: moving n disks
subproblem: moving (n-1) disks
14
We can do something similar here:
problem: finding largest in n numbers
subproblem: finding largest in first (n-1) numbers
Base case: if there is only one number, return that number!
Recurrence: if the subproblem is solved, say x is the
solution, how can we find the largest number among all n
numbers?
Check if (x > A[n]) // A stores the numbers
return x;
else
return(A[n]);
15
largest1(A[1..n]) {
if (n = 1) return A[1];
else
x = largest1(A[1..n-1]);
if (x > A[n]) return x;
else return A[n];
}
Time complexity:
T(n) = c1 if n =1;
T(n) = T(n-1) + c2 for n > 1.
=> T(n) = O(n).
Execution:
e.g.
largest1([4, 60, 21, 3, 5])
largest1([4, 60, 21, 3])
largest1([4, 60, 21])
largest1([4, 60])
largest1([4])
Base case: return 4
return 60
return
60
return
60
Ans: 60
16
Example: Find the largest number from a given set of n numbers
Another way to define subproblems:
Divide the numbers into two groups of size n/2 each.
Base case: If the group has only one number,
return it.
Recurrence: Assume that the two
subproblems have been solved and x1, x2 are
returned, what we do to get the final
answer?
Check if (x1 > x2)
return x1;
else
return x2;
17
largest2(A[1..n]) // for simplicity, assume n is a power of 2
{
If (n = 1)
return A[1];
else {
x1 = largest2(A[1..n/2]);
x2 = largest2(A[n/2+1..n]);
if (x1 > x2)
return x1;
else
return x2;
}
}
Let T(n) be the time complexity of largest2.
T(1) = c1
T(n) = 2T(n/2) + c2 where c1, c2: positive constants
⇒ T(n) = O(n)
7 56 100 20
34 33
34
18
e.g. 14 65 34 33 7 56 100 20
14 65 34 33
14 65
14 65 33
Remark: This problem, of course,
can be solved using a more
straightforward approach, so it is
only for illustration purpose
largest2(A[1..n])
{
If (n = 1)
return A[1];
else {
x1 = largest2(A[1..n/2]);
x2 = largest2(A[n/2+1..n]);
if (x1 > x2)
return x1;
else
return x2;
}
}
Base case
19
Note: the following straightforward approach will give
an algorithm with the same time complexity.
largest(A[1..n])
{
maximum = A[1];
for i = 2 to n do
if (A[i] > maximum)
maximum = A[i];
return maximum;
}
20
Remarks:
Theorem :
If T(n) = a T(n/b) + f(n) and f(n) = Θ(np), then
T(n) =
pa
pp
pp
ban
bann
ban
b
>Θ
=Θ
<Θ
if)(
if)log(
if)(
log
where a ≥1, b ≥ 2, p ≥ 0
How about n ≠ bk (e.g. b = 2) for any integer k?
Usually the time complexity remains the
same, but the algorithm will be
complicated to handle extra cases.
Interested students can explore more on
this aspect.
21
The Fibonacci numbers
Definition:
F1 = 1
F2 = 1
Fi = Fi-1 + Fi-2 for i > 2
Note: recursion may not always be a good solution
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …..
Problem: Generate the nth Fibonacci number
Algorithm 1: Direct implementation of recursive definition
FIB1(n) {
if (n <=2) then
return 1
else
return (FIB1(n-1) + FIB1(n-2))
}
Time complexity?
T(n) =
c1 if n≤2
T(n-1)+T(n-2) + c2 if n>2
where c1,c2 are constants
22
Claim: T(n) > 2(n-2)/2
Proof: T(n) > T(n-1) + T(n-2)
> T(n-2) + T(n-3) + T(n-2)
= 2T(n-2) + T(n-3)
> 2T(n-2)
> 2(2T(n-4)) = 4T(n-4)
> 4(2T(n-6)) = 8T(n-6)
> ....
> 2k T(n-2k)
If n is even, n-2k = 2. So, T(n) > 2(n-2)/2
If n is odd, n-2k = 1. So, T(n) > 2(n-1)/2
Therefore, T(n) is exponential in n and FIB1 runs in
exponential time.
Note: Fn can be shown to be
n
618.1
5
1
≅ T(n) = Θ(1.618n)
23
Can we do better?
Algorithm 2: Calculate Fn by a loop
FIB2(n) {
if (n <=2) then
return 1
else
p = 1
q = 1
for i = 3 to n do
r = p + q
p = q
q = r
return r
}
Time Complexity?
Θ(n)
In the recursive version, we need to
recompute FIB1(n) values for many n’s.
Q: Do you think we can
still do better?
24
Revisit: Computing Fibonacci Numbers
We first consider the following problem.
Given a 2x2 matrix A, design an algorithm to compute An
for any given n ≥ 1.
1st Attempt: A straight-forward implementation
Power1(A, n) { // n ≥ 1; A: 2 × 2 matrix
if (n = 1)
return A;
else
return 2-Multiply(A, Power1(A, n-1)); // details of 2-
} // Multiply omitted
Complexity:
2-Multiple takes constant time.
Power1(A, n) takes O(n) time.
25
2nd Attempt:
[Hint: if n is always a power of 2, can you design a better
(faster) algorithm?]
Power2(A, n) { // n = 2k for a non-neg int k; A: 2 × 2 matrix
if (n = 1)
return A;
else
B = Power2(A, n/2);
return 2-Multiply(B, B);
}
Complexity:
Let T(n) be the running time for Power2(A, n).
T(n) =
c1 if n = 1
T(n/2) + c2 if n > 1
where c1,c2 are constants
T(n) = O(log n).
26
How about for general n?
e.g. n = 10
A10 = A5 x A5
To compute A5: A5 = A x A4
To compute A4: A4 = A2 x A2
And A2 = A x A.
Power3(A, n) { // n ≥ 1; A: 2 × 2 matrix
if (n = 1)
return A;
else
if (n is odd)
B = Power3(A, (n-1)/2);
return(2-Multiply(A, 2-Multiply(B, B));
else
B = Power3(A, n/2);
return(2-Multiply(B, B));
}
If n is odd,
An = A x (An-1/2)2
else
An = An/2 x An/2
Complexity: O(log n)
27
0 1
How this relates to our problem (computing the Fibonacci #)?
[MIT, Ex31-3, p.981]
Hint: Consider the following matrix and its powers.
1 1
See if you can design a faster algorithm for computing
the n-th Fibonacci #.
28
One more example: The maximum subarray problem
Given an array A[1..n] of integers, find a nonempty,
contiguous subarray of A whose values have the largest sum.
e.g. 
 -4 6 -3 -1 6 1 -2
A[2..6] gives the largest sum (9)
29
1st attempt (brute-force approach)
Idea: check all possible subarrays
Max_subarray1(A, n){
max = -∞
for i = 1 to n
for j = i to n
sum = 0;
for k = i to j
sum = sum + A[k];
if sum > max
max = sum;
ans = (i, j, max);
return ans;
Time complexity: O(n3)
Can we do better?
30
This brute-force algorithm can be further improved due to
many redundant addition 
i/j
 1
 2
 3
 4
 …
1
 1
2
 2
 1
3
 3
 2
 1
4
 4
 3
 2
 1
 ….
…..
 …..
 …..
 …..
 …..
 ….
When i = 1; j = 1, we compute sum = A[1]
When i = 1; j = 2, we compute sum = A[1] + A[2]
When i = 1; j = 3, we compute sum = A[1] + A[2] + A[3]
redundant
When i = 1; j = 4, we compute sum = A[1] + A[2] + A[3] + A[4]
Do you know how to improve it to O(n2) time?
31
2nd attempt (brute-force approach with improvement)
Idea: check all possible subarrays, faster computation of sum
Max_subarray2(A, n){
max = -∞
for i = 1 to n
sum = 0;
for j = i to n
sum = 0;
for k = i to j
sum = sum + A[j];
if sum > max
max = sum;
ans = (i, j, max);
return ans;	
Time complexity:
O(n2)
Can we do better?
32
3rd attempt: How about divide-and-conquer approach?
middle
You know how to find the maximum subarray in the 1st half
You know how to find the maximum subarray in the 2nd half
What else you need to find?
We need to find also the maximum subarray across the mid point!
e.g. 3 -1 3 - 5 4 5 -4 2 0 4 
Recursion for 1st half returns (A[1..3], max = 5)
Recursion for 2nd half returns (A[8..10], max = 6)
But the correct answer is (A[5..6], max = 9)
33
Finding the max subarray across the middle:
Idea:
middle
Search for A[i, n/2] for 1 ≤ i ≤ n/2
with maximum sum.
max = -∞; sum = 0;
for i from n/2 downto 1
sum = sum + A[i];
if sum > max
max = sum
ans = i
return (i, max)
Search for A[,
n/2+1, j] for n/
2+1 ≤ j ≤ n with
maximum sum.
max = -∞; sum = 0;
for j from n/2+1 to n
sum = sum + A[i];
if sum > max
max = sum
ans = j
return (j, max)
Combine these two results
It takes O(n) time.
34
Can we do better?
Max_subarray3(A, p, q) {
(i1, j1, max1) = Max_subarray3(A, p, p+q/2);
(i2, j2, max2) = Max_subarray3(A, p+q/2+1, q);
(i3, j3, max3) = Max_subarray_middle(A, p, q);
if max 1 > max 2
if max 1 > max 3
return (i1, j1, max1)
else
return(i3, j3, max3)
else
if max2 > max3
return(i2, j2, max2)
else
return(i3, j3, max3)
}
Time complexity: T(n) = 2T(n/2) + cn for n > 1 (n = 2k)
=> T(n) = O(n log n)
O(n) time
35
Exercises
1) Given an array of numbers, design a recursive
algorithm to find the average of all numbers in the array
and analyze the time complexity of your algorithm.
2) Design a recursive algorithm for reversing the entries
in an array and analyze the time complexity of your
algorithm. You are only allowed to use constant amount
of extra storage.

More Related Content

What's hot (19)

IVR - Chapter 4 - Variational methods
IVR - Chapter 4 - Variational methodsIVR - Chapter 4 - Variational methods
IVR - Chapter 4 - Variational methods
 
Signals Processing Homework Help
Signals Processing Homework HelpSignals Processing Homework Help
Signals Processing Homework Help
 
Algorithm Design and Complexity - Course 11
Algorithm Design and Complexity - Course 11Algorithm Design and Complexity - Course 11
Algorithm Design and Complexity - Course 11
 
Fft presentation
Fft presentationFft presentation
Fft presentation
 
Operational research
Operational researchOperational research
Operational research
 
Lecture5
Lecture5Lecture5
Lecture5
 
Ss 2013 midterm
Ss 2013 midtermSs 2013 midterm
Ss 2013 midterm
 
Radix-2 DIT FFT
Radix-2 DIT FFT Radix-2 DIT FFT
Radix-2 DIT FFT
 
Signal Processing Assignment Help
Signal Processing Assignment HelpSignal Processing Assignment Help
Signal Processing Assignment Help
 
21 4 ztransform
21 4 ztransform21 4 ztransform
21 4 ztransform
 
Decimation in Time
Decimation in TimeDecimation in Time
Decimation in Time
 
Lec10
Lec10Lec10
Lec10
 
Decimation in time and frequency
Decimation in time and frequencyDecimation in time and frequency
Decimation in time and frequency
 
21 5 ztransform
21 5 ztransform21 5 ztransform
21 5 ztransform
 
Alex1 group2
Alex1 group2Alex1 group2
Alex1 group2
 
lecture 4
lecture 4lecture 4
lecture 4
 
Ejercicio de fasores
Ejercicio de fasoresEjercicio de fasores
Ejercicio de fasores
 
21 2 ztransform
21 2 ztransform21 2 ztransform
21 2 ztransform
 
Analysis Of Algorithms Ii
Analysis Of Algorithms IiAnalysis Of Algorithms Ii
Analysis Of Algorithms Ii
 

Similar to Copy of y16 02-2119divide-and-conquer

5.2 divede and conquer 03
5.2 divede and conquer 035.2 divede and conquer 03
5.2 divede and conquer 03Krish_ver2
 
5.2 divede and conquer 03
5.2 divede and conquer 035.2 divede and conquer 03
5.2 divede and conquer 03Krish_ver2
 
T2311 - Ch 4_Part1.pptx
T2311 - Ch 4_Part1.pptxT2311 - Ch 4_Part1.pptx
T2311 - Ch 4_Part1.pptxGadaFarhan
 
Algorithm Design and Complexity - Course 3
Algorithm Design and Complexity - Course 3Algorithm Design and Complexity - Course 3
Algorithm Design and Complexity - Course 3Traian Rebedea
 
Unit-1 DAA_Notes.pdf
Unit-1 DAA_Notes.pdfUnit-1 DAA_Notes.pdf
Unit-1 DAA_Notes.pdfAmayJaiswal4
 
lecture 3
lecture 3lecture 3
lecture 3sajinsc
 
Recurrence relation solutions
Recurrence relation solutionsRecurrence relation solutions
Recurrence relation solutionssubhashchandra197
 
5.2 divide and conquer
5.2 divide and conquer5.2 divide and conquer
5.2 divide and conquerKrish_ver2
 
Divide and conquer
Divide and conquerDivide and conquer
Divide and conquerVikas Sharma
 
CS330-Lectures Statistics And Probability
CS330-Lectures Statistics And ProbabilityCS330-Lectures Statistics And Probability
CS330-Lectures Statistics And Probabilitybryan111472
 
Solving recurrences
Solving recurrencesSolving recurrences
Solving recurrencesMegha V
 
Famous problem IMO 1988 Q6.pdf
Famous problem IMO 1988 Q6.pdfFamous problem IMO 1988 Q6.pdf
Famous problem IMO 1988 Q6.pdfAbdulHannif2
 
Binomial theorem for any index
Binomial theorem for any indexBinomial theorem for any index
Binomial theorem for any indexindu psthakur
 
Quicksort analysis
Quicksort analysisQuicksort analysis
Quicksort analysisPremjeet Roy
 

Similar to Copy of y16 02-2119divide-and-conquer (20)

5.2 divede and conquer 03
5.2 divede and conquer 035.2 divede and conquer 03
5.2 divede and conquer 03
 
5.2 divede and conquer 03
5.2 divede and conquer 035.2 divede and conquer 03
5.2 divede and conquer 03
 
T2311 - Ch 4_Part1.pptx
T2311 - Ch 4_Part1.pptxT2311 - Ch 4_Part1.pptx
T2311 - Ch 4_Part1.pptx
 
Algorithm Design and Complexity - Course 3
Algorithm Design and Complexity - Course 3Algorithm Design and Complexity - Course 3
Algorithm Design and Complexity - Course 3
 
Unit-1 DAA_Notes.pdf
Unit-1 DAA_Notes.pdfUnit-1 DAA_Notes.pdf
Unit-1 DAA_Notes.pdf
 
lecture 3
lecture 3lecture 3
lecture 3
 
Recurrence relation solutions
Recurrence relation solutionsRecurrence relation solutions
Recurrence relation solutions
 
L2
L2L2
L2
 
2.pptx
2.pptx2.pptx
2.pptx
 
L2
L2L2
L2
 
03 dc
03 dc03 dc
03 dc
 
5.2 divide and conquer
5.2 divide and conquer5.2 divide and conquer
5.2 divide and conquer
 
3.pdf
3.pdf3.pdf
3.pdf
 
Divide and conquer
Divide and conquerDivide and conquer
Divide and conquer
 
CS330-Lectures Statistics And Probability
CS330-Lectures Statistics And ProbabilityCS330-Lectures Statistics And Probability
CS330-Lectures Statistics And Probability
 
Solving recurrences
Solving recurrencesSolving recurrences
Solving recurrences
 
2018 MUMS Fall Course - Statistical Representation of Model Input (EDITED) - ...
2018 MUMS Fall Course - Statistical Representation of Model Input (EDITED) - ...2018 MUMS Fall Course - Statistical Representation of Model Input (EDITED) - ...
2018 MUMS Fall Course - Statistical Representation of Model Input (EDITED) - ...
 
Famous problem IMO 1988 Q6.pdf
Famous problem IMO 1988 Q6.pdfFamous problem IMO 1988 Q6.pdf
Famous problem IMO 1988 Q6.pdf
 
Binomial theorem for any index
Binomial theorem for any indexBinomial theorem for any index
Binomial theorem for any index
 
Quicksort analysis
Quicksort analysisQuicksort analysis
Quicksort analysis
 

Recently uploaded

CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 

Recently uploaded (20)

DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 

Copy of y16 02-2119divide-and-conquer

  • 1. 1 Recurrence, recursive function, divide-and-conquer approach Review: A function is recursive if it is defined in terms of itself. Recursive part: by following this recursion, the value of f(n) can be calculated by making progress towards the base case f(4) = f(3) + 4 = f(2) + 3 +4 = f(1) + 2 + 7 = 1 + 9 = 10 Base case: value of f(n) is known Two components of a recursion Q: How to find a “closed form” for f(n)? (how to solve it?) (non-recursive formula) e.g. f(n)= 1 n=1 f(n-1)+n n>1 Let n be positive integers Outcome (1) and (3): How to analyze recursive algorithms? Will teach an algortihm design technique.
  • 2. 2 Remarks: 1)  Then, formally prove it by MI. f(n) = f(n-1) + n = f(n-2) + (n-1) + n = ….. = f(1) + 2 + 3 + … + n = n(n+1)/2 One simple approach: The Iteration Method e.g. f(n)= 1 n=1 f(n-1)+n n>1 MI proof (sketch) Base: when n = 1, f(n) = 1 by definition. n(n+1)/2 = 1, so f(n) = n(n+1)/2 is true. Induction: for n = k, f(k) = f(k – 1)+k by definition = (k-1)k/2 + k by hypothesis = k(k+1)/2. 2) Sometimes we only need to know the solution in asymptotic notation.
  • 3. 3 f(n) = f(n-1) + n = f(n-2) + (n-1) + n = ….. = n(n+1)/2 e.g. f(n)= 1 n=1 f(n-1)+n n>1 If we only need to show that f(n) = O(n2), we only need to prove f(n) ≤ cn2 for some constant c for n ≥ 1 using MI. Step 1: try to get the value of c (do it in rough paper) For the induction to go through, f(n) = f(n-1) + n ≤ c(n-1)2 + n = cn2 – (2cn – c – n). Since we want f(n) ≤ cn2, so we set 2cn – c – n ≥ 0 ⇒ c ≥ n/(2n-1) where n/(2n-1) ≤ 1 for n ≥ 1 So, we can set c = 1. Step 2: formal proof We will show that f(n) ≤ n2 for all n ≥ 1. Base:…. Induction: …. Take-home exercise: Prove f(n) = O(n): f(n) = 3 for n = 1, otherwise f(n) = f(n-1) + 10.
  • 4. 4 Alg(n) { if (n = 1) return 1; temp = Alg(n-1); for (i = 1 to n) temp = temp + 1; return temp; } Let f(n) be the running time of Alg(n). e.g. f(n)= c1 n=1 f(n-1)+c2n n>1 where c1 and c2 are constants To analyze a recursive algorithm, (1)  we model the running time of the algorithm as a recursive function, then (2)  solve the recursive function to get the answer in asymptotic notation. The time complexity of Alg(n) is O(n2).
  • 5. 5 Solving recurrences (obtain the asymptotic bounds on the solution) [MIT, ch4.3] substitution method [MIT, ch4.4] recursion-tree method [MIT, ch4.5] master method Can you learn it yourself or let me know later if you want a tutorial [will NOT be a main topic in the exam]? Or you can get related material from web or any related reference books
  • 6. 6 Divide-and-conquer approach usually gives a recursive algorithm and the time complexity of the algorithm is usually formulated as a recursive function. Solving the recursive function will give the time complexity of the algorithm. Ø Divide problem into subproblems Ø Conquer subproblems recursively Ø Combine subproblem solutions Simple example: calculate n! Let f(n) = n!, then f(1) = 1 and f(n) = n*f(n-1) fact(n){ if (n = 1) return 1; else return n*fact(n-1); } Let T(n) be the running time of fact(n) Then, T(n) = c1 if n=1 T(n-1)+c2 if n>1 where c1,c2 are constants T(n) = T(n-1)+c2 = T(n-2)+c2+c2 = ….. = T(1) + (n-1)c2 = c1 + (n-1)c2 = O(n)
  • 7. 7 Review: Tower of Hanoi Given 3 pegs and n disks of different sizes placed in an increasing order of size on one peg, transfer the disks from the original peg to another peg such that: - only one disk can be moved in each step -  in each peg, the disks must be in increasing order of size 1 2 3 How?
  • 8. 8 Solve it recursively: Base case: if there is only one disk. 1 2 3 move disk from peg 1 to peg 3 Assuming that we know how to move n-1 disks, can we solve it for n disks?
  • 9. 9 1 2 3 Move top (n-1) disks from peg 1 to peg 2 1 2 3 Move the largest disks from peg 1 to peg 3 1 2 3 Move (n-1) disks from peg 2 to peg 3
  • 10. 10 TofH(A,B,C,n) // source peg: A, destination peg: C { if (n=1) move disk from A to C else { TofH(A,C,B,n-1); move disk from A to C; TofH(B,A,C,n-1); } } What is the number of moves? Let f(n) be the number of moves f(n) = 1 n=1 2f(n-1)+1 n>1 f(n) = 2f(n-1) + 1 = 2(2f(n-2)+1) + 1 = 22f(n-2) + 2 + 1 = 22(2f(n-3)+1) + 2 + 1 = 23f(n-3) + 22 + 2 + 1 = …. = 2n-1f(1) + 2n-2 + … + 2 + 1 = 2n-1 + 2n-2 + … + 2 + 1 = 2n - 1 How about time complexity of the algorithm? To call the program: TofH(1, 2,3, 3) // 3 disks
  • 11. 11 Review: Divide-and-conquer approach (1)  In order to obtain a solution for input size n, we assume the solution(s) for smaller n (subproblem) is available, then construct the final solution from these solutions. E.g. computing n! (assuming (n-1)! is available) E.g. solving the Tower of Hanoi with n disks (assuming we know how to do (n-1) disks) (2) Don’t forget the base case: E.g. n! = 1 when n = 1 E.g. Solving the Tower of Hanoi problem with 1 disk (3) Derive a “recursive” algorithm from this idea. (4) Capture the running time of the algorithm by a recursive function, then solve the recurrence for the time complexity of the algorithm. Pay attention to the subproblem definition =>
  • 12. 12 A student tries to solve the Tower of Hanoi problem recursively as follows: Assume that we know how to move n/2 disks (n: even for simplicity) TofH2(A,B,C,n) // source peg: A, destination peg: C { if (n=1) move disk from A to C else { TofH2(A,C,B,n/2); // move 1st half from A to B TofH2(A,B,C,n/2); // move 2nd half from A to C TofH2(B,A,C,n/2); // move 1st half from B to C } } Is it correct? Q: to solve this problem, is 2n – 1 the minimum number of moves? ** Definition: TofH(A,B,C,n): move n disks from A to C with B empty or having disks with the correct order & all larger than the given n disks.
  • 13. 13 Example: Find the largest number from a given set of n numbers using divide-and-conquer approach Divide the problem into subproblems 1)  Solve base cases for subproblems 2)  Assume that solutions of subproblems are available, combine them to find the solution for the original problem There may be more than one way to define the subproblems. Recall that for the problem of Tower of Hanoi: problem: moving n disks subproblem: moving (n-1) disks
  • 14. 14 We can do something similar here: problem: finding largest in n numbers subproblem: finding largest in first (n-1) numbers Base case: if there is only one number, return that number! Recurrence: if the subproblem is solved, say x is the solution, how can we find the largest number among all n numbers? Check if (x > A[n]) // A stores the numbers return x; else return(A[n]);
  • 15. 15 largest1(A[1..n]) { if (n = 1) return A[1]; else x = largest1(A[1..n-1]); if (x > A[n]) return x; else return A[n]; } Time complexity: T(n) = c1 if n =1; T(n) = T(n-1) + c2 for n > 1. => T(n) = O(n). Execution: e.g. largest1([4, 60, 21, 3, 5]) largest1([4, 60, 21, 3]) largest1([4, 60, 21]) largest1([4, 60]) largest1([4]) Base case: return 4 return 60 return 60 return 60 Ans: 60
  • 16. 16 Example: Find the largest number from a given set of n numbers Another way to define subproblems: Divide the numbers into two groups of size n/2 each. Base case: If the group has only one number, return it. Recurrence: Assume that the two subproblems have been solved and x1, x2 are returned, what we do to get the final answer? Check if (x1 > x2) return x1; else return x2;
  • 17. 17 largest2(A[1..n]) // for simplicity, assume n is a power of 2 { If (n = 1) return A[1]; else { x1 = largest2(A[1..n/2]); x2 = largest2(A[n/2+1..n]); if (x1 > x2) return x1; else return x2; } } Let T(n) be the time complexity of largest2. T(1) = c1 T(n) = 2T(n/2) + c2 where c1, c2: positive constants ⇒ T(n) = O(n)
  • 18. 7 56 100 20 34 33 34 18 e.g. 14 65 34 33 7 56 100 20 14 65 34 33 14 65 14 65 33 Remark: This problem, of course, can be solved using a more straightforward approach, so it is only for illustration purpose largest2(A[1..n]) { If (n = 1) return A[1]; else { x1 = largest2(A[1..n/2]); x2 = largest2(A[n/2+1..n]); if (x1 > x2) return x1; else return x2; } } Base case
  • 19. 19 Note: the following straightforward approach will give an algorithm with the same time complexity. largest(A[1..n]) { maximum = A[1]; for i = 2 to n do if (A[i] > maximum) maximum = A[i]; return maximum; }
  • 20. 20 Remarks: Theorem : If T(n) = a T(n/b) + f(n) and f(n) = Θ(np), then T(n) = pa pp pp ban bann ban b >Θ =Θ <Θ if)( if)log( if)( log where a ≥1, b ≥ 2, p ≥ 0 How about n ≠ bk (e.g. b = 2) for any integer k? Usually the time complexity remains the same, but the algorithm will be complicated to handle extra cases. Interested students can explore more on this aspect.
  • 21. 21 The Fibonacci numbers Definition: F1 = 1 F2 = 1 Fi = Fi-1 + Fi-2 for i > 2 Note: recursion may not always be a good solution 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ….. Problem: Generate the nth Fibonacci number Algorithm 1: Direct implementation of recursive definition FIB1(n) { if (n <=2) then return 1 else return (FIB1(n-1) + FIB1(n-2)) } Time complexity? T(n) = c1 if n≤2 T(n-1)+T(n-2) + c2 if n>2 where c1,c2 are constants
  • 22. 22 Claim: T(n) > 2(n-2)/2 Proof: T(n) > T(n-1) + T(n-2) > T(n-2) + T(n-3) + T(n-2) = 2T(n-2) + T(n-3) > 2T(n-2) > 2(2T(n-4)) = 4T(n-4) > 4(2T(n-6)) = 8T(n-6) > .... > 2k T(n-2k) If n is even, n-2k = 2. So, T(n) > 2(n-2)/2 If n is odd, n-2k = 1. So, T(n) > 2(n-1)/2 Therefore, T(n) is exponential in n and FIB1 runs in exponential time. Note: Fn can be shown to be n 618.1 5 1 ≅ T(n) = Θ(1.618n)
  • 23. 23 Can we do better? Algorithm 2: Calculate Fn by a loop FIB2(n) { if (n <=2) then return 1 else p = 1 q = 1 for i = 3 to n do r = p + q p = q q = r return r } Time Complexity? Θ(n) In the recursive version, we need to recompute FIB1(n) values for many n’s. Q: Do you think we can still do better?
  • 24. 24 Revisit: Computing Fibonacci Numbers We first consider the following problem. Given a 2x2 matrix A, design an algorithm to compute An for any given n ≥ 1. 1st Attempt: A straight-forward implementation Power1(A, n) { // n ≥ 1; A: 2 × 2 matrix if (n = 1) return A; else return 2-Multiply(A, Power1(A, n-1)); // details of 2- } // Multiply omitted Complexity: 2-Multiple takes constant time. Power1(A, n) takes O(n) time.
  • 25. 25 2nd Attempt: [Hint: if n is always a power of 2, can you design a better (faster) algorithm?] Power2(A, n) { // n = 2k for a non-neg int k; A: 2 × 2 matrix if (n = 1) return A; else B = Power2(A, n/2); return 2-Multiply(B, B); } Complexity: Let T(n) be the running time for Power2(A, n). T(n) = c1 if n = 1 T(n/2) + c2 if n > 1 where c1,c2 are constants T(n) = O(log n).
  • 26. 26 How about for general n? e.g. n = 10 A10 = A5 x A5 To compute A5: A5 = A x A4 To compute A4: A4 = A2 x A2 And A2 = A x A. Power3(A, n) { // n ≥ 1; A: 2 × 2 matrix if (n = 1) return A; else if (n is odd) B = Power3(A, (n-1)/2); return(2-Multiply(A, 2-Multiply(B, B)); else B = Power3(A, n/2); return(2-Multiply(B, B)); } If n is odd, An = A x (An-1/2)2 else An = An/2 x An/2 Complexity: O(log n)
  • 27. 27 0 1 How this relates to our problem (computing the Fibonacci #)? [MIT, Ex31-3, p.981] Hint: Consider the following matrix and its powers. 1 1 See if you can design a faster algorithm for computing the n-th Fibonacci #.
  • 28. 28 One more example: The maximum subarray problem Given an array A[1..n] of integers, find a nonempty, contiguous subarray of A whose values have the largest sum. e.g. -4 6 -3 -1 6 1 -2 A[2..6] gives the largest sum (9)
  • 29. 29 1st attempt (brute-force approach) Idea: check all possible subarrays Max_subarray1(A, n){ max = -∞ for i = 1 to n for j = i to n sum = 0; for k = i to j sum = sum + A[k]; if sum > max max = sum; ans = (i, j, max); return ans; Time complexity: O(n3) Can we do better?
  • 30. 30 This brute-force algorithm can be further improved due to many redundant addition i/j 1 2 3 4 … 1 1 2 2 1 3 3 2 1 4 4 3 2 1 …. ….. ….. ….. ….. ….. …. When i = 1; j = 1, we compute sum = A[1] When i = 1; j = 2, we compute sum = A[1] + A[2] When i = 1; j = 3, we compute sum = A[1] + A[2] + A[3] redundant When i = 1; j = 4, we compute sum = A[1] + A[2] + A[3] + A[4] Do you know how to improve it to O(n2) time?
  • 31. 31 2nd attempt (brute-force approach with improvement) Idea: check all possible subarrays, faster computation of sum Max_subarray2(A, n){ max = -∞ for i = 1 to n sum = 0; for j = i to n sum = 0; for k = i to j sum = sum + A[j]; if sum > max max = sum; ans = (i, j, max); return ans; Time complexity: O(n2) Can we do better?
  • 32. 32 3rd attempt: How about divide-and-conquer approach? middle You know how to find the maximum subarray in the 1st half You know how to find the maximum subarray in the 2nd half What else you need to find? We need to find also the maximum subarray across the mid point! e.g. 3 -1 3 - 5 4 5 -4 2 0 4 Recursion for 1st half returns (A[1..3], max = 5) Recursion for 2nd half returns (A[8..10], max = 6) But the correct answer is (A[5..6], max = 9)
  • 33. 33 Finding the max subarray across the middle: Idea: middle Search for A[i, n/2] for 1 ≤ i ≤ n/2 with maximum sum. max = -∞; sum = 0; for i from n/2 downto 1 sum = sum + A[i]; if sum > max max = sum ans = i return (i, max) Search for A[, n/2+1, j] for n/ 2+1 ≤ j ≤ n with maximum sum. max = -∞; sum = 0; for j from n/2+1 to n sum = sum + A[i]; if sum > max max = sum ans = j return (j, max) Combine these two results It takes O(n) time.
  • 34. 34 Can we do better? Max_subarray3(A, p, q) { (i1, j1, max1) = Max_subarray3(A, p, p+q/2); (i2, j2, max2) = Max_subarray3(A, p+q/2+1, q); (i3, j3, max3) = Max_subarray_middle(A, p, q); if max 1 > max 2 if max 1 > max 3 return (i1, j1, max1) else return(i3, j3, max3) else if max2 > max3 return(i2, j2, max2) else return(i3, j3, max3) } Time complexity: T(n) = 2T(n/2) + cn for n > 1 (n = 2k) => T(n) = O(n log n) O(n) time
  • 35. 35 Exercises 1) Given an array of numbers, design a recursive algorithm to find the average of all numbers in the array and analyze the time complexity of your algorithm. 2) Design a recursive algorithm for reversing the entries in an array and analyze the time complexity of your algorithm. You are only allowed to use constant amount of extra storage.