A Trie is a tree-like data structure that stores strings by sharing common prefixes. Each node represents a character, and paths from root to nodes form words or prefixes.
Click to reveal answer
beginner
How does a Hash Map handle prefix matching?
A Hash Map stores complete keys and values. For prefix matching, it requires checking all keys to find those starting with the prefix, which can be slow for many keys.
Click to reveal answer
intermediate
Why is Trie more efficient than Hash Map for prefix matching?
Trie directly follows the prefix path in the tree, quickly finding all words with that prefix without scanning all keys, unlike Hash Map which may check every key.
Click to reveal answer
intermediate
What is a downside of using Trie compared to Hash Map?
Trie uses more memory because it stores nodes for each character, even if some prefixes are rare, while Hash Map stores only complete keys and values.
Click to reveal answer
beginner
In Rust, which data structure is better for fast prefix search: Trie or Hash Map?
Trie is better for fast prefix search because it efficiently navigates prefixes. Hash Map is better for exact key lookups but slower for prefix queries.
Click to reveal answer
Which data structure stores strings by sharing common prefixes?
AStack
BHash Map
CLinked List
DTrie
✗ Incorrect
Trie stores strings by sharing prefixes, making prefix searches efficient.
What is a main disadvantage of using Hash Map for prefix matching?
ANeeds to check all keys for prefix
BUses too much memory
CCannot store strings
DSlow exact key lookup
✗ Incorrect
Hash Map requires scanning all keys to find those matching a prefix, which is slow.
Which data structure uses more memory due to storing nodes for each character?
ATrie
BHash Map
CArray
DQueue
✗ Incorrect
Trie stores nodes for each character, increasing memory usage.
For exact key lookups, which data structure is generally faster?
ATrie
BGraph
CHash Map
DBinary Tree
✗ Incorrect
Hash Map provides fast exact key lookups using hashing.
In Rust, which data structure is preferred for fast prefix search?
AHash Map
BTrie
CVector
DHash Set
✗ Incorrect
Trie efficiently supports prefix search by following character paths.
Explain how a Trie works for prefix matching and why it is efficient compared to a Hash Map.
Think about how words share beginnings and how Trie uses that.
You got /4 concepts.
Describe the trade-offs between using a Trie and a Hash Map for prefix matching in terms of speed and memory.
Consider speed for prefix vs exact search and memory usage.
You got /4 concepts.
Practice
(1/5)
1. Which data structure is generally more efficient for prefix matching in a large set of strings?
easy
A. Linked List, because it allows easy insertion and deletion
B. Hash Map, because it provides constant time lookup for any key
C. Array, because it stores elements in contiguous memory
D. Trie, because it stores common prefixes once and allows fast prefix queries
Solution
Step 1: Understand prefix matching requirements
Prefix matching needs to find all strings starting with a given prefix efficiently.
Step 2: Compare Trie and Hash Map for prefix queries
Trie stores common prefixes once and allows traversal by characters, making prefix queries fast. Hash Map is good for exact key lookup but not for prefix searches.
Final Answer:
Trie, because it stores common prefixes once and allows fast prefix queries -> Option D
Quick Check:
Prefix matching = Trie [OK]
Hint: Prefix queries need shared paths, so Trie is best [OK]
Assuming arrays or lists are good for prefix matching
2. Which Rust code snippet correctly declares a HashMap to store strings as keys and integers as values?
easy
A. let map = HashMap::new();
B. let map: HashMap = HashMap::new();
C. let map: std::collections::HashMap = std::collections::HashMap::new();
D. let map = HashMap();
Solution
Step 1: Check correct HashMap declaration syntax in Rust
Rust requires specifying types inside angle brackets and calling HashMap::new() without parameters.
Step 2: Validate each option
let map: std::collections::HashMap = std::collections::HashMap::new(); correctly declares a HashMap with String keys and i32 values using full path and new().
Final Answer:
let map: std::collections::HashMap = std::collections::HashMap::new(); -> Option C
Hint: Use HashMap::new() with type annotations for keys and values [OK]
Common Mistakes:
Using parentheses instead of ::new()
Swapping key and value types
Omitting type annotations when needed
3. Given the following Rust code using a Trie for prefix matching, what will be the output?
struct TrieNode {
children: std::collections::HashMap,
is_end: bool,
}
impl TrieNode {
fn new() -> Self {
TrieNode { children: std::collections::HashMap::new(), is_end: false }
}
}
fn main() {
let mut root = TrieNode::new();
// Insert "cat"
let mut node = &mut root;
for c in "cat".chars() {
node = node.children.entry(c).or_insert(TrieNode::new());
}
node.is_end = true;
// Check prefix "ca"
let mut node = &root;
let mut found = true;
for c in "ca".chars() {
if let Some(next) = node.children.get(&c) {
node = next;
} else {
found = false;
break;
}
}
println!("{}", found);
}
medium
A. false
B. Compilation error
C. true
D. Runtime panic
Solution
Step 1: Analyze TrieNode struct definition
TrieNode { children: HashMap, ... } creates a recursive type without indirection (e.g., Box<TrieNode>). Rust cannot compute the size of TrieNode, resulting in a compilation error.
Step 2: Confirm error prevents execution
Code fails to compile, so no output or runtime behavior occurs.
Final Answer:
Compilation error -> Option B
Quick Check:
Recursive TrieNode without Box = compile error [OK]
Hint: Rust recursive structs require Box or Rc for children [OK]
Common Mistakes:
Assuming prefix must be a complete word
Confusing is_end with prefix existence
Ignoring Rust recursive type size requirements
4. The following Rust code attempts to use a HashMap for prefix matching but has a bug. What is the bug?
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert("apple", 1);
map.insert("app", 2);
let prefix = "ap";
let mut found = false;
for key in map.keys() {
if key.starts_with(prefix) {
found = true;
break;
}
}
println!("{}", found);
}
medium
A. Inefficient prefix search due to linear scan over keys
B. Using &str keys without lifetime causes compilation error
C. HashMap keys are unordered, so starts_with check is invalid
D. No bug; code works correctly for prefix matching
Solution
Step 1: Analyze prefix matching approach
The code scans all keys linearly and checks if they start with the prefix, which works but is inefficient for large data.
Step 2: Identify the bug type
There is no syntax or runtime error, but the approach is inefficient compared to Trie which supports fast prefix queries.
Final Answer:
Inefficient prefix search due to linear scan over keys -> Option A
Quick Check:
Linear scan for prefix = inefficient [OK]
Hint: HashMap needs full key; prefix search requires scanning all keys [OK]
Common Mistakes:
Thinking code has syntax or runtime errors
Assuming HashMap keys are ordered
Ignoring performance implications
5. You need to implement a system in Rust that supports fast insertion and prefix search for millions of words. Which approach is best and why?
// Option A: Use a Trie with HashMap children
// Option B: Use a HashMap storing all words as keys
// Option C: Use a sorted Vec and binary search for prefix
// Option D: Use a LinkedList of words and scan linearly
hard
A. Trie, because it shares prefixes and allows O(k) prefix search where k is prefix length
B. HashMap, because it provides O(1) exact lookup but slow prefix search
C. Sorted Vec, because binary search helps but prefix search needs extra logic
D. LinkedList, because insertion is fast but prefix search is very slow
Solution
Step 1: Evaluate insertion and prefix search efficiency
Trie allows insertion and prefix search in O(k) time, where k is prefix length, by sharing common prefixes.
Step 2: Compare other data structures
HashMap is fast for exact keys but slow for prefix search. Sorted Vec requires complex prefix range search. LinkedList is slow for prefix search.
Final Answer:
Trie, because it shares prefixes and allows O(k) prefix search where k is prefix length -> Option A
Quick Check:
Fast prefix search = Trie [OK]
Hint: Prefix search speed depends on prefix length, Trie is best [OK]
Common Mistakes:
Choosing HashMap for prefix search
Ignoring complexity of prefix range search in sorted Vec
Underestimating LinkedList search cost
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.