Reference usage patterns in Rust - Time & Space Complexity
We want to see how using references in Rust affects how long a program takes to run.
Specifically, we ask: does borrowing data change how many steps the program needs?
Analyze the time complexity of the following code snippet.
fn sum_values(values: &Vec) -> i32 {
let mut total = 0;
for &value in values {
total += value;
}
total
}
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
let result = sum_values(&numbers);
println!("Sum: {}", result);
}
This code sums all numbers in a list by borrowing the list instead of taking ownership.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each element in the vector.
- How many times: Once for each item in the list.
As the list gets bigger, the program does more additions, one per item.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 additions |
| 100 | 100 additions |
| 1000 | 1000 additions |
Pattern observation: The work grows directly with the number of items.
Time Complexity: O(n)
This means the time to finish grows in a straight line with the list size.
[X] Wrong: "Using references makes the program run faster by doing fewer steps."
[OK] Correct: Borrowing data avoids copying but does not reduce the number of times the program processes each item.
Understanding how references affect time helps you explain efficient data handling clearly and confidently.
"What if we changed the vector to a linked list? How would the time complexity change?"
Practice
& symbol represent in Rust when used before a variable?Solution
Step 1: Understand the meaning of
In Rust,&in Rust&creates a reference to a value, which means you can read the value without taking ownership.Step 2: Differentiate from mutable references and pointers
&mutis used for mutable references, and Rust references are never null pointers, so&is not a pointer that can be null.Final Answer:
A reference to the variable, allowing read-only access without ownership -> Option CQuick Check:
&means read-only reference [OK]
- Confusing & with &mut for mutability
- Thinking & creates a copy of the value
- Assuming & can be null pointer
num in Rust?Solution
Step 1: Recall syntax for mutable references
In Rust, to create a mutable reference, you use&mutbefore the variable name.Step 2: Check each option
let ref = # uses&which is an immutable reference. let ref = *num; uses dereference operator*incorrectly here. let ref = mut # has incorrect syntax order.Final Answer:
let ref = &mut num; -> Option BQuick Check:
Mutable reference syntax = &mut [OK]
- Using & instead of &mut for mutable references
- Placing mut after & incorrectly
- Using * instead of & for references
fn main() {
let x = 10;
let y = &x;
println!("{}", y);
}Solution
Step 1: Understand the reference
Variabley = &xyis a reference tox, so it points to the value 10.Step 2: Printing a reference with
Rust automatically dereferencesprintln!("{}", y)ywhen printing, so it prints the value 10, not the address or &10.Final Answer:
10 -> Option AQuick Check:
Printing reference prints value [OK]
- Expecting &10 to print literally
- Thinking it prints memory address
- Assuming compilation error due to reference
fn main() {
let mut num = 5;
let r = #
*r = 10;
println!("{}", num);
}Solution
Step 1: Check reference mutability
Variableris an immutable reference tonumbecause it is declared as&num, not&mut num.Step 2: Understand assignment through reference
You cannot assign a new value through an immutable reference. The line*r = 10;causes a compilation error.Final Answer:
Cannot assign to *r because r is an immutable reference -> Option AQuick Check:
Immutable reference cannot be used to modify value [OK]
- Forgetting to use &mut for mutable references
- Thinking mut on variable alone allows mutation through immutable ref
- Ignoring compiler error messages
vec?
fn add_value(v: &mut Vec<i32>) {
v.push(42);
}
fn main() {
let mut vec = vec![1, 2, 3];
// Which call is correct here?
}Solution
Step 1: Understand function parameter type
The functionadd_valueexpects a mutable reference&mut Vec<i32>.Step 2: Check how to pass mutable reference
To pass a mutable reference, the variable must be mutable and passed as&mut vec. Passing&vecis immutable reference, and passingvecmoves ownership.Final Answer:
add_value(&mut vec); -> Option DQuick Check:
Mutable reference call uses &mut [OK]
- Passing immutable reference when mutable is needed
- Passing ownership instead of reference
- Incorrect syntax like mut &var
Ready to prove it?
Pass the test and this pattern moves unknown
