Every AI system needs to store and retrieve data - quickly. Whether it's a list of pixel values in an image, a vocabulary of 50,000 words, or millions of user preferences, the choice of data structure determines how fast your AI can think.
Two structures dominate: arrays and hash maps. Master these, and you've got the foundation for nearly every AI pipeline.
An array is simply a numbered list of items stored side by side in memory. Each item has an index - its position in the list, starting from zero.
index: 0 1 2 3 4
value: ["cat", "dog", "bird", "fish", "frog"]
Because items sit next to each other, you can jump straight to any position. Want item 3? Done - no searching required. That's O(1) access, meaning it takes the same time whether the array holds 10 items or 10 million.
Inserting or removing items in the middle is expensive. Every item after the change must shuffle along. That's O(n) - the more items, the longer it takes.
If you had a playlist of 10,000 songs and wanted to insert a new track at position 5, every song from position 5 onwards would need to shift. How might a streaming service handle this without slowing down?
A hash map (also called a dictionary or hash table) stores data as key-value pairs. Instead of accessing items by index number, you access them by a meaningful key.
word_counts = {
"hello": 42,
"world": 37,
"AI": 156
}
Need the count for "AI"? The hash map uses a hash function to convert the key into an index behind the scenes. The result? O(1) average lookup time - just like arrays, but using names instead of numbers.
Python's dictionaries are hash maps. When ChatGPT counts word frequencies during training, it uses hash-map-like structures to track billions of word occurrences across the entire internet's text.
| Operation | Array | Hash Map | |-----------|-------|----------| | Access by index | O(1) ⚡ | N/A | | Access by key | O(n) 🐢 | O(1) ⚡ | | Insert at end | O(1) ⚡ | O(1) ⚡ | | Insert in middle | O(n) 🐢 | N/A | | Search for value | O(n) 🐢 | O(1) ⚡ |
Think of O(1) as "instant, no matter the size" and O(n) as "slower the bigger the data."
You have 100,000 user profiles and need to find a user by their username. Which structure is fastest?
One of the most useful patterns in both interviews and AI is counting occurrences. Here's the idea in pseudocode:
counts = {}
for each word in text:
if word in counts:
counts[word] = counts[word] + 1
else:
counts[word] = 1
This single pass through the text gives you every word's frequency. Language models use exactly this approach (at massive scale) to understand which words matter most.
Given an array of numbers and a target, find two numbers that add up to the target. The naive approach checks every pair - O(n²). The clever approach uses a hash map:
seen = {}
for each number in array:
complement = target - number
if complement in seen:
return [seen[complement], current_index]
seen[number] = current_index
One pass, O(n) time. The hash map remembers what you've already seen.
Why is the hash map approach to two-sum faster than checking every pair?
A recommendation engine needs to check whether a user has already watched a film before suggesting it. Would you store the user's watch history in an array or a hash map? What trade-offs come to mind?
An AI model stores word embeddings as arrays of 300 numbers each. Why are arrays a good choice here?