Array Traversal Patterns in DSA Rust - Time & Space Complexity
When we look at array traversal, we want to know how the time to finish changes as the array gets bigger.
We ask: How many steps does it take to visit every item in the array?
Analyze the time complexity of the following code snippet.
fn sum_array(arr: &[i32]) -> i32 {
let mut total = 0;
for &value in arr.iter() {
total += value;
}
total
}
This code adds up all the numbers in an array by visiting each element once.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each element of the array once.
- How many times: Exactly as many times as there are elements (n times).
As the array gets bigger, the number of steps grows directly with the number of items.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 additions |
| 100 | 100 additions |
| 1000 | 1000 additions |
Pattern observation: Doubling the array size doubles the work needed.
Time Complexity: O(n)
This means the time to finish grows in a straight line with the number of elements.
[X] Wrong: "Since the loop is simple, it must be faster than other loops."
[OK] Correct: Even a simple loop still touches every element, so time grows with input size just the same.
Understanding how simple loops scale helps you explain and improve code efficiency in many real tasks.
"What if we nested another loop inside to compare each element with every other? How would the time complexity change?"
Practice
for i in 0..5 { println!("{}", i); }Solution
Step 1: Understand the range syntax 0..5
The range 0..5 in Rust includes numbers starting at 0 up to but not including 5.Step 2: Trace the loop iterations
The loop variable i takes values 0, 1, 2, 3, and 4, printing each number.Final Answer:
Prints numbers from 0 to 4 -> Option DQuick Check:
Range 0..5 excludes 5, so output is 0 to 4 [OK]
- Thinking 0..5 includes 5
- Confusing 0..5 with 0..=5
- Assuming loop starts at 1
arr in Rust?Solution
Step 1: Check valid iteration over array indices
Rust arrays have a length method .len(), so 0..arr.len() gives valid indices.Step 2: Access elements by index
Using arr[i] inside the loop accesses each element correctly.Final Answer:
for i in 0..arr.len() { println!("{}", arr[i]); } -> Option AQuick Check:
Use 0..arr.len() for index-based iteration [OK]
- Using 0..arr instead of 0..arr.len()
- Trying to iterate directly over arr without reference
- Using arr.len() without range syntax
let arr = [10, 20, 30];
for i in (0..arr.len()).rev() {
print!("{} ", arr[i]);
}Solution
Step 1: Understand the range and reverse
The range 0..arr.len() is 0..3, which is 0,1,2. Using .rev() reverses it to 2,1,0.Step 2: Print elements in reverse order
arr[2] = 30, arr[1] = 20, arr[0] = 10, so output is "30 20 10 "Final Answer:
30 20 10 -> Option CQuick Check:
Reverse iteration prints elements backward [OK]
- Forgetting .rev() reverses the order
- Printing indices instead of array values
- Confusing range end with inclusive
arr:let arr = [1, 2, 3];
for i in 0..arr.len() {
println!("{}", arr[i+1]);
}Solution
Step 1: Analyze the loop indices and access
The loop runs i from 0 to 2 (arr.len()=3). Accessing arr[i+1] means indices 1,2,3.Step 2: Identify out of bounds access
arr[3] does not exist, causing runtime panic (index out of bounds).Final Answer:
Index out of bounds error at runtime -> Option BQuick Check:
Accessing arr[i+1] exceeds array length [OK]
- Assuming arr[i+1] is safe for all i
- Ignoring runtime panics
- Confusing compile-time and runtime errors
arr of integers, which code snippet correctly prints only the even-indexed elements (0, 2, 4, ...) of the array?Solution
Step 1: Understand step_by usage
The method step_by(2) skips every second index, so 0, 2, 4, ...Step 2: Confirm correct element access
Using arr[i] inside the loop prints elements at even indices correctly.Final Answer:
for i in (0..arr.len()).step_by(2) { println!("{}", arr[i]); } -> Option AQuick Check:
step_by(2) iterates over even indices [OK]
- Using i % 2 == 1 instead of 0 for even indices
- Multiplying i by 2 causing out of bounds
- Using rev() which reverses order unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
