Sieve of Eratosthenes Find All Primes in DSA Python - Time & Space Complexity
We want to understand how the time needed to find all prime numbers grows as the input number gets bigger.
Specifically, how does the work change when we increase the limit up to which we find primes?
Analyze the time complexity of the following code snippet.
def sieve_of_eratosthenes(n):
primes = [True] * (n + 1)
primes[0], primes[1] = False, False
p = 2
while p * p <= n:
if primes[p]:
for i in range(p * p, n + 1, p):
primes[i] = False
p += 1
return [x for x in range(n + 1) if primes[x]]
This code finds all prime numbers up to n by marking multiples of each prime as not prime.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Marking multiples of each prime number as not prime inside the inner for-loop.
- How many times: The outer while-loop runs roughly up to the square root of n, and the inner loop marks multiples starting from p squared up to n.
As n grows, the number of operations grows a bit faster than n but much slower than n squared.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 to 30 operations |
| 100 | About 300 to 400 operations |
| 1000 | About 4000 to 5000 operations |
Pattern observation: The operations grow roughly proportional to n times the logarithm of the logarithm of n, which is slower than n log n but faster than linear.
Time Complexity: O(n log log n)
This means the time needed grows a bit faster than n but much slower than n squared, making it efficient for large n.
[X] Wrong: "The algorithm checks every number against all smaller numbers, so it must be O(n²)."
[OK] Correct: The algorithm only marks multiples of primes, skipping many numbers quickly, so it does much less work than checking all pairs.
Understanding this algorithm's time complexity shows you can analyze efficient number-based algorithms, a useful skill for many coding challenges.
"What if we started marking multiples from 2*p instead of p*p? How would the time complexity change?"
Practice
Sieve of Eratosthenes algorithm?Solution
Step 1: Understand the algorithm's goal
The Sieve of Eratosthenes is designed to identify prime numbers efficiently.Step 2: Recognize the output
It marks multiples of primes as non-prime, leaving primes unmarked up to the limit.Final Answer:
To find all prime numbers up to a given limit -> Option AQuick Check:
Sieve of Eratosthenes = Find primes [OK]
- Confusing it with sorting algorithms
- Thinking it calculates factorials
- Assuming it finds divisors instead of primes
n?Solution
Step 1: Understand sieve initialization
The sieve list should mark all numbers as potentially prime initially, so all True.Step 2: Check correct length
It must include index n, so length is n+1.Final Answer:
sieve = [True] * (n+1) -> Option CQuick Check:
Initialize all True for 0 to n [OK]
- Using False instead of True initially
- Not including n in the list length
- Using range instead of boolean list
n = 10
sieve = [True] * (n+1)
sieve[0], sieve[1] = False, False
for i in range(2, int(n**0.5)+1):
if sieve[i]:
for j in range(i*i, n+1, i):
sieve[j] = False
primes = [i for i in range(n+1) if sieve[i]]
print(primes)Solution
Step 1: Initialize sieve and mark 0,1 as non-prime
Indices 0 and 1 are set to False, others True initially.Step 2: Mark multiples of primes as False
For i=2 and i=3 (since sqrt(10) ~3), multiples 4,6,8,9,10 are marked False.Step 3: Collect primes
Numbers with True are 2,3,5,7.Final Answer:
[2, 3, 5, 7] -> Option BQuick Check:
Primes up to 10 = [2,3,5,7] [OK]
- Including 1 as prime
- Forgetting to start inner loop at i*i
- Marking wrong multiples
n = 15
sieve = [True] * (n+1)
sieve[0], sieve[1] = False, False
for i in range(2, n):
if sieve[i]:
for j in range(i*2, n+1, i):
sieve[j] = False
primes = [i for i in range(n+1) if sieve[i]]
print(primes)Solution
Step 1: Check inner loop start index
Starting from i*2 marks some multiples multiple times, inefficient.Step 2: Correct start is i*i
Because smaller multiples are already marked by smaller primes.Final Answer:
Inner loop should start from i*i, not i*2 -> Option AQuick Check:
Start inner loop at i*i for efficiency [OK]
- Starting inner loop at i*2 wastes time
- Incorrect sieve length causes index errors
- Marking 0 or 1 as prime
Solution
Step 1: List primes up to 30 using sieve logic
Primes are 2,3,5,7,11,13,17,19,23,29.Step 2: Count the primes
Count is 10 primes between 1 and 30 inclusive.Final Answer:
10 -> Option DQuick Check:
Count primes ā¤30 = 10 [OK]
- Including 1 as prime
- Forgetting to include 29
- Miscounting primes between 20 and 30
Ready to prove it?
Pass the test and this pattern moves unknown
