Collision Handling Using Chaining in DSA Javascript - Time & Space Complexity
When we use chaining to handle collisions in a hash table, we want to know how fast operations like search, insert, and delete run.
We ask: How does the time to do these operations grow as the number of items increases?
Analyze the time complexity of inserting and searching in a hash table using chaining.
class HashTable {
constructor(size) {
this.buckets = Array(size).fill(null).map(() => []);
}
hash(key) {
return key.length % this.buckets.length;
}
insert(key, value) {
const index = this.hash(key);
this.buckets[index].push({ key, value });
}
search(key) {
const index = this.hash(key);
for (const pair of this.buckets[index]) {
if (pair.key === key) return pair.value;
}
return null;
}
}
This code stores key-value pairs in buckets. Each bucket is a list that holds all items with the same hash index.
Look at what repeats when we insert or search:
- Primary operation: Looping through the list (chain) at a bucket index.
- How many times: Depends on how many items share the same bucket (chain length).
As we add more items, chains get longer if the number of buckets stays the same.
| Input Size (n) | Approx. Operations (chain length) |
|---|---|
| 10 | About 1-2 items per chain |
| 100 | About 10 items per chain |
| 1000 | About 100 items per chain |
Pattern observation: If buckets stay fixed, chain length grows roughly proportional to n, making operations slower.
Time Complexity: O(n/k) where k is number of buckets
This means the time depends on how many items share the same bucket. More buckets mean shorter chains and faster operations.
[X] Wrong: "Hash table operations are always O(1) no matter what."
[OK] Correct: If many items collide into the same bucket, the chain grows and operations slow down, making it closer to O(n).
Understanding how chaining affects time helps you explain hash table performance clearly, a key skill in coding interviews.
"What if we increase the number of buckets as we add items? How would that change the time complexity?"
Practice
collision handling using chaining in hash tables?Solution
Step 1: Understand collision in hash tables
When two keys hash to the same index, a collision occurs.Step 2: How chaining handles collisions
Chaining stores all collided elements in a linked list at that index.Final Answer:
Store multiple elements in a linked list at the same index when collisions occur -> Option CQuick Check:
Chaining = linked list at index [OK]
- Thinking chaining replaces old values
- Confusing chaining with open addressing
- Assuming resizing happens on every collision
Solution
Step 1: Understand array initialization with unique lists
Usingfill([])fills all indexes with the same array reference.Step 2: Use
Array.fromwith a function to create unique arraysArray.from({ length: 10 }, () => [])creates a new empty array at each index.Final Answer:
const table = Array.from({ length: 10 }, () => []); -> Option BQuick Check:
Unique arrays per index = const table = Array.from({ length: 10 }, () => []); [OK]
- Using fill([]) causes all indexes to share one array
- new Array(10) leaves slots undefined
- Filling with null does not create lists for chaining
const table = Array.from({ length: 5 }, () => []);
function hash(key) { return key % 5; }
// Insert keys
[7, 12, 17].forEach(key => {
const index = hash(key);
table[index].push(key);
});
console.log(table);What is the output printed?
Solution
Step 1: Calculate hash index for each key
7 % 5 = 2, 12 % 5 = 2, 17 % 5 = 2.Step 2: Insert keys at index 2
All keys go into table[2], so table[2] = [7, 12, 17].Final Answer:
[[], [], [7, 12, 17], [], []] -> Option DQuick Check:
All keys at index 2 = [[], [], [7, 12, 17], [], []] [OK]
- Miscomputing modulo results
- Inserting keys at wrong indexes
- Confusing array positions in output
const table = new Array(3).fill([]);
function hash(key) { return key % 3; }
function insert(key) {
const index = hash(key);
table[index].push(key);
}
insert(1);
insert(4);
insert(7);
console.log(table);What is the bug and how to fix it?
Solution
Step 1: Identify the bug with fill([])
Using fill([]) assigns the same array reference to all indexes.Step 2: Fix by creating unique arrays per index
UseArray.from({ length: 3 }, () => [])to create separate arrays.Final Answer:
Bug: All indexes share the same array; Fix: Use Array.from with () => [] -> Option AQuick Check:
fill([]) shares arrays, Array.from creates unique ones [OK]
- Changing hash function unnecessarily
- Using wrong array methods
- Ignoring shared reference problem
key % 4. After all insertions, which index has the longest chain and what is its content?Solution
Step 1: Compute hash index for each key
3 % 4 = 3, 7 % 4 = 3, 11 % 4 = 3, 15 % 4 = 3, 19 % 4 = 3.Step 2: Insert all keys at index 3
All keys go into table[3], so chain is [3, 7, 11, 15, 19].Final Answer:
Index 3: [3, 7, 11, 15, 19] -> Option AQuick Check:
All keys mod 4 = 3, chain length 5 [OK]
- Miscomputing modulo for some keys
- Assuming keys spread across indexes
- Forgetting all keys collide at same index
Ready to prove it?
Pass the test and this pattern moves unknown
