Prefix Search Using Trie in DSA C - Time & Space Complexity
We want to understand how fast we can find words that start with a given prefix using a Trie.
The question is: how does the search time grow as the prefix length or number of words changes?
Analyze the time complexity of the following code snippet.
// Search for prefix in Trie
bool startsWith(TrieNode* root, const char* prefix) {
TrieNode* node = root;
for (int i = 0; prefix[i] != '\0'; i++) {
int index = prefix[i] - 'a';
if (!node->children[index]) {
return false;
}
node = node->children[index];
}
return true;
}
This code checks if any word in the Trie starts with the given prefix by following nodes for each prefix character.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Loop over each character of the prefix.
- How many times: Exactly once per prefix character, so length of prefix (let's call it m).
The time to search grows directly with the prefix length, not the number of words stored.
| Input Size (prefix length m) | Approx. Operations |
|---|---|
| 10 | 10 steps |
| 100 | 100 steps |
| 1000 | 1000 steps |
Pattern observation: The search time grows linearly with the prefix length, independent of total words stored.
Time Complexity: O(m)
This means the search time depends only on how long the prefix is, not on how many words are in the Trie.
[X] Wrong: "The search time depends on the total number of words stored in the Trie."
[OK] Correct: The search only follows nodes for the prefix characters, so it depends on prefix length, not total words.
Knowing how Trie prefix search scales helps you explain efficient word lookups clearly and confidently in interviews.
"What if we changed the Trie to store uppercase and lowercase letters? How would the time complexity change?"
Practice
Trie data structure in prefix search?Solution
Step 1: Understand the role of Trie in prefix search
A Trie stores characters of words in a tree structure, allowing quick prefix lookups.Step 2: Identify the main use case
It helps find all words starting with a prefix efficiently, unlike sorting or arithmetic.Final Answer:
To efficiently find all words that start with a given prefix -> Option DQuick Check:
Trie = Prefix search efficiency [OK]
- Confusing Trie with sorting algorithms
- Thinking Trie is for arithmetic
- Assuming Trie stores numbers only
Solution
Step 1: Identify Trie node components
A Trie node has an array of pointers for each alphabet letter and a flag for word end.Step 2: Match with given options
typedef struct TrieNode { struct TrieNode* children[26]; int isEndOfWord; } TrieNode; matches this structure with 26 children pointers and an end-of-word flag.Final Answer:
typedef struct TrieNode { struct TrieNode* children[26]; int isEndOfWord; } TrieNode; -> Option CQuick Check:
Trie node = children array + end flag [OK]
- Using linked list pointers instead of array for children
- Confusing Trie node with linked list or binary tree node
- Missing end-of-word flag
insert("cat");
insert("car");
insert("dog");
searchPrefix("ca");Solution
Step 1: Insert words into Trie
Words "cat", "car", and "dog" are inserted, building branches for 'c' and 'd'.Step 2: Search prefix "ca"
Both "cat" and "car" start with "ca", so they are returned by searchPrefix.Final Answer:
["cat", "car"] -> Option AQuick Check:
Prefix "ca" matches cat and car [OK]
- Returning only one matching word
- Returning words not matching prefix
- Empty result for existing prefix
void insert(TrieNode* root, char* word) {
TrieNode* node = root;
for (int i = 0; word[i] != '\0'; i++) {
int index = word[i] - 'a';
if (node->children[index] == NULL) {
node->children[index] = malloc(sizeof(TrieNode));
}
node = node->children[index];
}
node->isEndOfWord = 1;
}Solution
Step 1: Analyze node creation
malloc allocates memory but does not initialize children pointers or isEndOfWord flag.Step 2: Identify impact
Uninitialized children pointers can cause undefined behavior during traversal or insertion.Final Answer:
New nodes are not initialized after malloc -> Option AQuick Check:
malloc needs initialization [OK]
- Assuming malloc zeroes memory
- Ignoring initialization of isEndOfWord
- Misunderstanding loop condition
Solution
Step 1: Use Trie prefix traversal
Traverse the Trie to the node representing the prefix "app" to limit search space.Step 2: Collect words of length 5 from that node
From this node, recursively collect words that complete to length 5.Final Answer:
Traverse Trie to node for "app", then collect words of length 5 from there -> Option BQuick Check:
Prefix traversal + length filter = Traverse Trie to node for "app", then collect words of length 5 from there [OK]
- Filtering all words instead of prefix subtree
- Searching prefix as full word
- Using binary search on Trie data
Ready to prove it?
Pass the test and this pattern moves unknown
