Sieve of Eratosthenes Find All Primes in DSA Go - Time & Space Complexity
We want to understand how the time needed to find all prime numbers up to a limit grows as the limit gets bigger.
How does the number of steps change when we increase the range of numbers checked?
Analyze the time complexity of the following code snippet.
func sieve(n int) []bool {
primes := make([]bool, n+1)
for i := 2; i <= n; i++ {
primes[i] = true
}
for i := 2; i*i <= n; i++ {
if primes[i] {
for j := i * i; j <= n; j += i {
primes[j] = false
}
}
}
return primes
}
This code marks all prime numbers up to n by crossing out multiples of each prime.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The inner loop that marks multiples of each prime as not prime.
- How many times: For each prime i, it marks multiples starting from i*i up to n, stepping by i.
As n grows, the number of operations grows a bit faster than n but much less than n squared.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 to 30 steps |
| 100 | About 300 to 400 steps |
| 1000 | About 4000 to 5000 steps |
Pattern observation: The steps grow roughly proportional to n times the logarithm of the logarithm of n, which is slower than n log n but faster than n.
Time Complexity: O(n log log n)
This means the time grows a little faster than n but much slower than n squared, making it efficient for large n.
[X] Wrong: "The inner loop runs n times for each i, so total is O(n²)."
[OK] Correct: The inner loop starts at i*i and jumps by i, so it runs fewer times as i grows, making total steps much less than n².
Understanding this time complexity shows you can analyze nested loops with decreasing work, a skill useful for many algorithms.
"What if we started marking multiples from 2*i instead of i*i? 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 a limit.Final Answer:
To find all prime numbers up to a given limit -> Option BQuick 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: Identify correct slice type and size
We need a boolean slice of size n+1 to include index n.Step 2: Check Go syntax for slice creation
make([]bool, n+1)correctly creates a boolean slice of length n+1.Final Answer:
primes := make([]bool, n+1) -> Option DQuick Check:
Boolean slice with length n+1 = primes := make([]bool, n+1) [OK]
- Using int slice instead of bool
- Incorrect slice length causing index errors
- Wrong slice initialization syntax
n = 10 if true means prime and false means not prime?func sieve(n int) []bool {
primes := make([]bool, n+1)
for i := 2; i <= n; i++ {
primes[i] = true
}
for i := 2; i*i <= n; i++ {
if primes[i] {
for j := i * i; j <= n; j += i {
primes[j] = false
}
}
}
return primes
}
fmt.Println(sieve(10))Solution
Step 1: Initialize primes slice for n=10
Indices 0 and 1 are false; 2 to 10 are initially true.Step 2: Mark multiples of primes as false
Multiples of 2: 4,6,8,10 set false; multiples of 3: 9 set false.Final Answer:
[false false true true false true false true false false false] -> Option AQuick Check:
Primes at 2,3,5,7 true; multiples false [OK]
- Marking primes as false by mistake
- Starting inner loop from i instead of i*i
- Incorrect slice indexing
func sieve(n int) []bool {
primes := make([]bool, n)
for i := 2; i <= n; i++ {
primes[i] = true
}
for i := 2; i*i <= n; i++ {
if primes[i] {
for j := i * i; j <= n; j += i {
primes[j] = false
}
}
}
return primes
}Solution
Step 1: Check slice size vs index usage
Slice is length n, but code accesses primes[n], which is out of range.Step 2: Understand Go slice indexing
Valid indices are 0 to n-1, so primes[n] causes runtime panic.Final Answer:
Slice length is n, but indices go up to n causing out-of-range error -> Option CQuick Check:
Slice size mismatch causes index error [OK]
- Ignoring slice length vs index range
- Starting loops incorrectly
- Misunderstanding slice initialization defaults
n = 30?Consider the standard sieve implementation where indices 0 and 1 are not prime.
Solution
Step 1: List primes up to 30
Primes are 2,3,5,7,11,13,17,19,23,29.Step 2: Count the primes
Counting gives 10 primes.Final Answer:
10 -> Option AQuick Check:
Count primes ⤠30 = 10 [OK]
- Including non-primes like 9 or 15
- Forgetting to exclude 1 and 0
- Miscounting primes near 30
Ready to prove it?
Pass the test and this pattern moves unknown
