Loop labels in Rust - Time & Space Complexity
When using loop labels in Rust, it's important to understand how the loops run and how many times the code inside repeats.
We want to know how the total work grows as the input size changes when loops are labeled and nested.
Analyze the time complexity of the following code snippet.
fn labeled_loops(n: usize) {
'outer: for i in 0..n {
for j in 0..n {
if i + j > n {
break 'outer;
}
}
}
}
This code uses a labeled loop to break out of the outer loop from inside the inner loop based on a condition.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Nested loops where the inner loop runs up to n times for each outer loop iteration.
- How many times: The outer loop runs approximately n times, but breaks early when i + j > n.
As n grows, the loops run more times, but the break can stop the loops early.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 55 |
| 100 | 5050 |
| 1000 | 500500 |
Pattern observation: The total work grows approximately quadratically with n (about n(n+1)/2 inner loop iterations).
Time Complexity: O(n^2)
This means the work grows quadratically with the input size, due to the nested loops and the break condition limiting iterations but still resulting in roughly n²/2 operations.
[X] Wrong: "Because of the break with the label, the loops only run once or a few times regardless of n."
[OK] Correct: The break only happens when a condition is met, so the loops can still run many times depending on input size.
Understanding how labeled loops affect execution helps you explain loop control clearly and reason about performance in nested loops.
"What if the break condition was removed? How would the time complexity change?"
Practice
loop labels in Rust?Solution
Step 1: Understand loop labels concept
Loop labels let you assign a name to a loop, especially useful when loops are nested.Step 2: Identify the use of labels
Labels allow you to break or continue a specific loop by referring to its name, avoiding ambiguity.Final Answer:
To name loops so you can break or continue specific loops inside nested loops. -> Option CQuick Check:
Loop labels = control nested loops [OK]
- Thinking labels create infinite loops
- Confusing labels with variable declarations
- Assuming labels optimize performance automatically
Solution
Step 1: Recall Rust loop label syntax
In Rust, a loop label is written as'label:before the loop keyword.Step 2: Match syntax options
label: loop { /* code */ } correctly places the label before the loop with a colon, e.g.,'label: loop {}.Final Answer:
label: loop { /* code */ } -> Option AQuick Check:
Label syntax = 'label: loop' [OK]
- Placing label after loop keyword
- Using colon after loop instead of label
- Putting label inside loop body
fn main() {
let mut count = 0;
'outer: loop {
println!("Outer loop: {}", count);
let mut inner_count = 10;
loop {
println!(" Inner loop: {}", inner_count);
if inner_count == 9 {
break 'outer;
}
inner_count -= 1;
}
count += 1;
}
println!("Done");
}Solution
Step 1: Trace outer loop first iteration
count starts at 0, prints "Outer loop: 0". Then inner loop starts with inner_count = 10.Step 2: Trace inner loop and break condition
Inner loop prints 10, then 9. When inner_count == 9, it breaks the 'outer loop, exiting both loops.Final Answer:
Outer loop: 0 Inner loop: 10 Inner loop: 9 Done -> Option DQuick Check:
Break 'outer stops both loops at inner_count 9 [OK]
- Thinking break only exits inner loop
- Missing that break 'outer exits both loops
- Assuming loops continue infinitely
fn main() {
'start: loop {
loop {
break start;
}
}
}Solution
Step 1: Check break statement syntax
In Rust, breaking a labeled loop requires the label with an apostrophe, e.g.,break 'start;.Step 2: Identify the missing apostrophe
The code usesbreak start;missing the apostrophe before the label name, causing a syntax error.Final Answer:
Missing apostrophe before label name in break statement. -> Option AQuick Check:
Label break syntax = break 'label [OK]
- Omitting apostrophe in break label
- Assuming labels are variables
- Thinking break can't target outer loops
'outer and 'inner, how can you skip the current iteration of the outer loop from inside the inner loop?Solution
Step 1: Understand continue with labels
Usingcontinue 'outer;skips the current iteration of the loop labeled 'outer, jumping to its next iteration.Step 2: Differentiate break and continue
breakexits the loop, whilecontinueskips to the next iteration. To skip outer loop iteration from inner loop, usecontinue 'outer;.Final Answer:
Use continue 'outer; inside the inner loop. -> Option BQuick Check:
continue 'label skips that loop iteration [OK]
- Using break instead of continue to skip iteration
- Omitting label in continue statement
- Confusing break and continue effects
Ready to prove it?
Pass the test and this pattern moves unknown
