Hash Map vs Array vs Linked List for Lookup in DSA Javascript - Complexity Comparison
Let's explore how fast we can find an item in different data structures: hash maps, arrays, and linked lists.
We want to know how the time to find something changes as the data grows.
Analyze the time complexity of the following code snippet.
// Lookup in an array
function lookupArray(arr, target) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === target) return i;
}
return -1;
}
// Lookup in a linked list
function lookupLinkedList(head, target) {
let current = head;
while (current !== null) {
if (current.value === target) return current;
current = current.next;
}
return null;
}
// Lookup in a hash map
function lookupHashMap(map, target) {
return map[target] !== undefined ? map[target] : null;
}
This code shows how to find a target value in an array, a linked list, and a hash map.
- Primary operation in array: Loop through each element until target is found.
- Primary operation in linked list: Traverse nodes one by one until target is found.
- Primary operation in hash map: Direct access using key (no loop).
- How many times: Up to n times for array and linked list, 1 time for hash map.
As the number of items grows, the time to find an item changes differently for each structure.
| Input Size (n) | Array / Linked List Operations | Hash Map Operations |
|---|---|---|
| 10 | Up to 10 checks | 1 direct check |
| 100 | Up to 100 checks | 1 direct check |
| 1000 | Up to 1000 checks | 1 direct check |
Pattern observation: Array and linked list grow linearly with input size, hash map stays constant.
Time Complexity: O(n) for Array and Linked List, O(1) for Hash Map
This means finding an item takes longer as data grows in arrays and linked lists, but stays fast in hash maps.
[X] Wrong: "Hash maps always take longer because they use more memory."
[OK] Correct: Hash maps use extra memory but find items instantly, so lookup is faster despite memory use.
Understanding these differences helps you choose the right data structure for fast lookups, a key skill in coding challenges and real projects.
"What if the array was sorted and we used binary search? How would the time complexity change?"
Practice
Solution
Step 1: Understand lookup times for each data structure
Hash Maps use keys to directly access values, giving average O(1) time. Arrays require scanning or index access, O(n) or O(1) if index known. Linked Lists require scanning, O(n).Step 2: Compare average lookup speeds
Hash Map is fastest for key-based lookup because it uses hashing. Arrays and Linked Lists are slower for key lookup.Final Answer:
Hash Map -> Option AQuick Check:
Fastest lookup by key = Hash Map [OK]
- Thinking arrays are always fastest because of index access
- Confusing linked list traversal with direct access
- Assuming stack is a lookup structure
Solution
Step 1: Recall JavaScript Map methods
JavaScript Map has a method called has() to check if a key exists.Step 2: Evaluate each option
map.has(key) uses map.has(key) which is correct. 'key in map' works for objects, not Map. 'contains' and 'includes' are not Map methods.Final Answer:
map.has(key) -> Option DQuick Check:
Check key in Map = map.has(key) [OK]
- Using 'in' operator on Map instead of Object
- Using non-existent methods like contains or includes on Map
- Confusing array methods with Map methods
const arr = [10, 20, 30, 40];
const map = new Map();
map.set('a', 1);
map.set('b', 2);
console.log(arr.indexOf(30));
console.log(map.has('b'));
console.log(map.get('c'));Solution
Step 1: Analyze array indexOf(30)
Array arr is [10,20,30,40]. indexOf(30) returns 2 because 30 is at index 2.Step 2: Check map.has('b') and map.get('c')
map.has('b') is true because 'b' exists. map.get('c') returns undefined because 'c' key does not exist.Final Answer:
2 true undefined -> Option CQuick Check:
indexOf(30)=2, has('b')=true, get('c')=undefined [OK]
- Assuming map.get returns null for missing keys
- Confusing array index with value
- Thinking map.has returns value instead of boolean
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
function contains(head, target) {
if (head === null) return false;
while (head.next !== null) {
if (head.value === target) return true;
head = head.next;
}
return false;
}Solution
Step 1: Understand the loop condition
The loop runs while head.next !== null, so it stops before the last node.Step 2: Check if last node is checked
Because loop stops before last node, last node's value is never checked, so target in last node is missed.Final Answer:
It misses checking the last node's value -> Option AQuick Check:
Loop condition excludes last node check [OK]
- Using head.next !== null instead of head !== null
- Assuming last node is checked inside loop
Solution
Step 1: Understand requirements
We need fast existence check and order preservation of user IDs.Step 2: Compare data structures
Array preserves order but slow lookup (O(n)). Linked List preserves order but slow lookup (O(n)). Map preserves order and fast lookup by key and stores key-value pairs. Set preserves insertion order and fast lookup for unique values but does not store key-value pairs.Step 3: Choose best fit
Map stores key-value pairs, preserves insertion order, and offers O(1) lookup, making it ideal for checking existence and maintaining order.Final Answer:
Map -> Option BQuick Check:
Fast lookup + order + key-value = Map [OK]
- Choosing Set when key-value pairs are needed
- Using Array and expecting fast lookup
- Confusing Linked List order with lookup speed
Ready to prove it?
Pass the test and this pattern moves unknown
