Group_by for categorization in Ruby - Time & Space Complexity
We want to understand how the time needed to group items changes as the list gets bigger.
How does the work grow when we categorize many items?
Analyze the time complexity of the following code snippet.
numbers = [1, 2, 3, 4, 5, 6]
groups = numbers.group_by { |num| num.even? }
# groups will be {true => [2, 4, 6], false => [1, 3, 5]}
This code groups numbers into two categories: even and odd.
- Primary operation: Going through each number once to check if it is even or odd.
- How many times: Exactly once for each number in the list.
As the list gets bigger, the time to group grows in a straight line with the number of items.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: Doubling the list size roughly doubles the work.
Time Complexity: O(n)
This means the time to group items grows directly with the number of items.
[X] Wrong: "Grouping takes more time because it creates many groups inside the loop."
[OK] Correct: Actually, grouping just checks each item once and adds it to a group. The number of groups does not multiply the work for each item.
Knowing how grouping scales helps you explain how your code handles bigger data smoothly and shows you understand efficient data organization.
"What if we nested group_by calls to group items by two conditions? How would the time complexity change?"
Practice
group_by do when called on an array?Solution
Step 1: Understand the purpose of
Thegroup_bygroup_bymethod organizes elements by a condition and returns a hash.Step 2: Compare with other array methods
Sorting, removing duplicates, or converting to string are different methods likesort,uniq, orjoin.Final Answer:
It groups elements into a hash based on a given condition. -> Option BQuick Check:
group_by = groups hash [OK]
- Confusing group_by with sort or uniq
- Expecting an array instead of a hash
- Thinking it changes element order only
nums by even or odd using group_by?Solution
Step 1: Recall block syntax for group_by
The method requires a block with curly braces or do-end and a block variable.Step 2: Check each option's syntax
nums.group_by { |n| n % 2 == 0 } uses correct block with{ |n| ... }. nums.group_by(n % 2 == 0) misses block. nums.group_by do n % 2 == 0 end lacks block variable. nums.group_by ->(n) { n % 2 == 0 } uses lambda incorrectly.Final Answer:
nums.group_by { |n| n % 2 == 0 } -> Option CQuick Check:
Correct block syntax = nums.group_by { |n| n % 2 == 0 } [OK]
- Omitting block variable in block
- Passing condition as argument instead of block
- Using lambda syntax incorrectly
words = ['apple', 'banana', 'avocado', 'blueberry']
groups = words.group_by { |w| w[0] }
puts groupsSolution
Step 1: Understand group_by with first letter
The block groups words by their first character, so keys are 'a' and 'b'.Step 2: Check output format of group_by
It returns a hash with keys as letters and values as arrays of words starting with that letter.Final Answer:
{"a"=>["apple", "avocado"], "b"=>["banana", "blueberry"]} -> Option DQuick Check:
group_by first char = hash with arrays [OK]
- Expecting an array instead of a hash
- Confusing keys and values in output
- Misreading output as string instead of hash
numbers = [1, 2, 3, 4] groups = numbers.group_by do n n.even? end puts groups
Solution
Step 1: Check block syntax for group_by
The block must have a variable to represent each element, likedo |n| ... end.Step 2: Identify the missing block variable
The code usesdo nwithout vertical bars, sonis treated as a local variable, causing error.Final Answer:
Missing block variable in the do-end block. -> Option AQuick Check:
Block variable required in do-end [OK]
- Omitting vertical bars around block variable
- Thinking even? is undefined for integers
- Believing group_by needs sorted array
people = [
{name: 'Alice', age: 30},
{name: 'Bob', age: 20},
{name: 'Carol', age: 30},
{name: 'Dave', age: 20}
]
Which code correctly groups people by their age using group_by?Solution
Step 1: Understand data structure and access
Each element is a hash with symbol keys like :age, so access withperson[:age].Step 2: Check each option's key access
people.group_by { |person| person[:age] } uses correct symbol key access. people.group_by { |person| person.name } and D use dot notation which doesn't work on hashes. people.group_by { |person| person['age'] } uses string key which is incorrect here.Final Answer:
people.group_by { |person| person[:age] } -> Option AQuick Check:
Hash keys accessed by symbols = people.group_by { |person| person[:age] } [OK]
- Using dot notation on hashes
- Using string keys instead of symbols
- Confusing array of hashes with objects
Ready to prove it?
Pass the test and this pattern moves unknown
