Efficient data structure for word lookup with wildcards
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.
Introduction
Efficient word lookup in large datasets is a common challenge, especially when wildcards are involved. Wildcards allow flexible querying by substituting certain parts of a word with symbols like *
which can represent multiple characters, or ?
for a single character. Selecting the right data structure becomes critical for optimizing both space and search time, particularly as the dataset grows in size.
Trie as a Data Structure for Wildcard Lookup
Tries are tree-like data structures that store a dynamic set of keys, usually strings. Each node represents a character, and strings are stored as paths down the tree.
Basic Trie Structure
- Root Node: The starting point with no value but connects to all possible first characters of stored strings.
- Child Nodes: Represent each subsequent character of a stored string.
- End Nodes: Nodes marked to signify the end of a string within the trie.
Trie Implementation in Word Lookup
To implement word lookup using wildcards in a trie, one can follow these basic steps:
- Basic Insertion: Insert each word into the trie character by character.
- Traversal with Wildcards:
- For
?Wildcards: Traverse to each child node. - For
*Wildcards: Recursively explore each potential path that fits the wildcard until constraints are exhausted.
Example
Suppose we have a dictionary containing the words "bat", "ball", and "rack". A trie representation would look as follows:
- Space Efficiency: Better than standard tries, but might need additional mechanisms to manage and traverse compressed links, especially with wildcards.
- Advantages:
- Optimal for scenarios where wildcard placement is at the end of the search string.
- Quick lookup times thanks to linear time complexity associated with pattern searches.
- Supports all kinds of wildcard placements, but requires careful traversal strategies.
- Example: In the text "HELLO", all suffixes ("HELLO", "ELLO", "LLO", "LO", "O") will be organized for rapid queries. If we look for "E*O", we can quickly locate these suffixes and find matches.
- Memory Usage: Tries and suffix trees can consume considerable amounts of memory compared to other structures.
- Complexity in Modification: Once built, these structures can be more complex to modify than simple lists or hash maps.
- Special Cases: Complex wildcards combining
*with?may necessitate sophisticated parsing and traversal strategies.
Related reading
- Efficient data structure that checks for existence of String
- Efficient data structure/algorithm for transliteration based word lookup
- Efficient floating-point division with constant integer divisors
- Efficient item binning algorithm itertools/numpy
- Efficient list intersection algorithm
- Efficient manipulation of a list of cartesian coordinates in Python
- Efficient implementation of log2__m256d in AVX2
- Efficient multiplication of very large matrices in MATLAB

DSA Fundamentals
Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.