Reduce/inject for accumulation in Ruby - Time & Space Complexity
We want to understand how the time to add up values using reduce or inject changes as the list gets bigger.
How does the number of steps grow when we accumulate many items?
Analyze the time complexity of the following code snippet.
numbers = [1, 2, 3, 4, 5]
sum = numbers.reduce(0) do |acc, num|
acc + num
end
puts sum
This code adds all numbers in the array using reduce, starting from zero.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Adding each number to the accumulator inside the reduce loop.
- How many times: Once for each item in the array.
Each new number means one more addition step.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 additions |
| 100 | 100 additions |
| 1000 | 1000 additions |
Pattern observation: The steps grow directly with the number of items.
Time Complexity: O(n)
This means the time to add all numbers grows in a straight line as the list gets bigger.
[X] Wrong: "Reduce runs in constant time no matter how many items there are."
[OK] Correct: Reduce must visit each item once, so time grows with the list size.
Understanding how reduce works helps you explain how simple loops add up values efficiently in real tasks.
"What if we used reduce to multiply all numbers instead of adding? How would the time complexity change?"
Practice
inject do when used on an array?Solution
Step 1: Understand the purpose of
Theinjectinjectmethod takes all elements of an array and combines them into one value using the block provided.Step 2: Compare with other options
Sorting, removing duplicates, or returning the first element are different methods likesort,uniq, orfirst.Final Answer:
It combines all elements into a single value using a block. -> Option AQuick Check:
inject combines elements = C [OK]
- Confusing inject with sorting methods
- Thinking inject returns an array
- Assuming inject removes duplicates
arr using inject?Solution
Step 1: Identify the correct initial value and operation
To sum elements, start with 0 and add each element:inject(0) { |sum, n| sum + n }.Step 2: Check other options
arr.inject { |sum, n| sum - n } subtracts, C multiplies starting at 1, A divides. Only D sums correctly.Final Answer:
arr.inject(0) { |sum, n| sum + n } -> Option BQuick Check:
Sum with inject = D [OK]
- Starting sum with 1 instead of 0
- Using wrong operation like subtraction
- Omitting initial value causing errors
numbers = [2, 3, 4]
result = numbers.inject(1) { |product, n| product * n }
puts resultSolution
Step 1: Understand the initial value and operation
The initial value is 1, and each element multiplies the accumulator: 1*2=2, 2*3=6, 6*4=24.Step 2: Calculate the final product
The final result after all multiplications is 24.Final Answer:
24 -> Option DQuick Check:
2*3*4 = 24 [OK]
- Adding instead of multiplying
- Starting with 0 causing zero result
- Confusing output with sum
arr = [1, 2, 3]
sum = arr.inject { |total, n| total + n }
puts sumSolution
Step 1: Check if initial value is required
When no initial value is given, inject uses the first element as the start and iterates from the second element.Step 2: Verify the sum calculation
It correctly sums 1 + 2 + 3 = 6 without error.Final Answer:
No error; code works fine. -> Option AQuick Check:
inject without initial value sums correctly = A [OK]
- Assuming initial value is always required
- Thinking block parameters order is wrong
- Believing inject needs symbol argument
:name and :price, how can you use inject to find the total price of all products?
products = [
{ name: "Book", price: 12 },
{ name: "Pen", price: 3 },
{ name: "Notebook", price: 7 }
]Solution
Step 1: Access the price key correctly
Each product is a hash, so access price withproduct[:price].Step 2: Sum prices starting at 0
Start with 0 and add each price to get total price.Step 3: Check other options
products.inject { |total, product| total + product.name } uses dot notation which is invalid for hashes, C multiplies prices, D uses dot notation again.Final Answer:
products.inject(0) { |total, product| total + product[:price] } -> Option CQuick Check:
Sum prices with inject and hash keys = B [OK]
- Using dot notation for hash keys
- Multiplying prices instead of summing
- Starting sum at 1 instead of 0
Ready to prove it?
Pass the test and this pattern moves unknown
