Collision Handling Using Open Addressing Linear Probing
📖 Scenario: Imagine you are building a simple phone book app that stores names and phone numbers. You want to store these entries in a small table where each name is linked to a phone number. Sometimes, two names might want to go into the same spot in the table. To handle this, you will use a method called linear probing to find the next free spot.
🎯 Goal: Build a simple hash table using an array and handle collisions using open addressing with linear probing. You will insert names and phone numbers, and then print the final state of the table showing where each entry is stored.
📋 What You'll Learn
Create an array called hashTable with 5 empty slots initialized to null.
Create a simple hash function called hash that converts a name to an index between 0 and 4.
Insert three entries into the hashTable using linear probing to handle collisions.
Print the final state of the hashTable showing index and stored entry or null.
💡 Why This Matters
🌍 Real World
Hash tables are used in many apps like phone books, caches, and databases to quickly find information by keys like names or IDs.
💼 Career
Understanding collision handling in hash tables is important for software engineers working on efficient data storage and retrieval systems.
Progress0 / 4 steps
1
Create the hash table array
Create an array called hashTable with 5 slots, each initialized to null.
DSA Typescript
Hint
Think of the hash table as a row of 5 empty mailboxes, each ready to hold one name.
2
Create the hash function
Create a function called hash that takes a key string and returns a number between 0 and 4 by summing the character codes and taking modulo 5.
DSA Typescript
Hint
Sum the Unicode values of each letter in the name, then use modulo 5 to get an index between 0 and 4.
3
Insert entries using linear probing
Insert these entries into hashTable using linear probing: 'Amy', 'Bob', and 'Eve'. Use the hash function to find the starting index. If the spot is taken, move to the next index until you find an empty slot.
DSA Typescript
Hint
Try to put each name in the spot given by the hash. If taken, check the next spot, and keep going until you find an empty one.
4
Print the final hash table
Print the hashTable array showing each index and the stored value or null.
DSA Typescript
Hint
Loop through the array and print each index with the stored name or null if empty.
Practice
(1/5)
1. What is the main idea behind linear probing in collision handling for hash tables?
easy
A. Double the size of the hash table when a collision happens.
B. Use a linked list to store multiple values at the same index.
C. If a collision occurs, check the next slot sequentially until an empty slot is found.
D. Replace the existing value at the collided slot with the new value.
Solution
Step 1: Understand collision handling
When two keys hash to the same index, a collision occurs.
Step 2: Explain linear probing method
Linear probing resolves collisions by checking the next slot in order until an empty slot is found.
Final Answer:
If a collision occurs, check the next slot sequentially until an empty slot is found. -> Option C
Quick Check:
Linear probing = sequential slot check [OK]
Hint: Linear probing means try next slot one by one [OK]
Common Mistakes:
Confusing linear probing with chaining
Thinking collision means resizing immediately
Replacing existing values on collision
2. Which of the following TypeScript code snippets correctly implements the linear probing step to find the next index after a collision in a hash table of size size?
easy
A. let nextIndex = currentIndex % size;
B. let nextIndex = (currentIndex * 2) % size;
C. let nextIndex = (currentIndex - 1) % size;
D. let nextIndex = (currentIndex + 1) % size;
Solution
Step 1: Understand linear probing index calculation
Linear probing moves to the next slot by adding 1 to the current index and wrapping around using modulo.
Step 2: Check code correctness
let nextIndex = (currentIndex + 1) % size; correctly calculates nextIndex as (currentIndex + 1) % size, ensuring wrap-around.
Final Answer:
let nextIndex = (currentIndex + 1) % size; -> Option D
Quick Check:
Next index = (current + 1) mod size [OK]
Hint: Add 1 and mod by size for next slot [OK]
Common Mistakes:
Multiplying index instead of adding
Subtracting index causing negative values
Not using modulo for wrap-around
3. Consider a hash table of size 5 using linear probing. The hash function is h(key) = key % 5. Insert keys in this order: 7, 12, 17. What is the final state of the hash table (index: value)?
medium
A. {0: null, 1: null, 2: 7, 3: 12, 4: 17}
B. {0: 17, 1: 7, 2: 12, 3: null, 4: null}
C. {0: 12, 1: 17, 2: 7, 3: null, 4: null}
D. {0: null, 1: 7, 2: null, 3: 12, 4: 17}
Solution
Step 1: Calculate initial hash indices
7 % 5 = 2, 12 % 5 = 2, 17 % 5 = 2. All keys hash to index 2.
Step 2: Insert keys using linear probing
Insert 7 at index 2. For 12, index 2 is occupied, try 3 (empty), insert 12. For 17, indices 2 and 3 occupied, try 4 (empty), insert 17.
All keys start at 2, linear probe fills next slots [OK]
Hint: All keys hash same, fill next slots sequentially [OK]
Common Mistakes:
Placing all keys at index 2 ignoring collisions
Not wrapping around the table
Misplacing keys at wrong indices
4. The following TypeScript code tries to insert keys into a hash table using linear probing. What is the bug that causes an infinite loop?
const size = 5;
const table = new Array(size).fill(null);
function hash(key: number) { return key % size; }
function insert(key: number) {
let index = hash(key);
while (table[index] !== null) {
index = (index + 1) % size;
}
table[index] = key;
}
insert(5);
insert(10);
insert(15);
insert(20);
insert(25);
insert(30);
medium
A. No check for full table causing infinite loop when table is full.
B. Hash function is incorrect and returns negative indices.
C. Array initialization with null is wrong; should use undefined.
D. Insert function does not update index inside the loop.
Solution
Step 1: Analyze insert loop behavior
The while loop keeps moving index until an empty slot is found.
Step 2: Identify missing full table check
If the table is full, the loop cycles endlessly without exit condition.
Final Answer:
No check for full table causing infinite loop when table is full. -> Option A
Quick Check:
Full table without exit causes infinite loop [OK]
Hint: Add full table check to avoid infinite loop [OK]
Common Mistakes:
Assuming hash function returns negative
Thinking null vs undefined causes loop
Forgetting to update index inside loop
5. You have a hash table of size 7 using linear probing. The hash function is h(key) = key % 7. You insert keys: 14, 21, 28, 35, 42. Then you delete key 21. What is the correct way to handle deletion to avoid search errors in linear probing?
hard
A. Set the slot to null immediately to free it for new insertions.
B. Mark the slot as a special 'deleted' marker instead of null to continue probing.
C. Rehash the entire table after deletion to fix collisions.
D. Do nothing; deletion is not needed in linear probing.
Solution
Step 1: Understand deletion problem in linear probing
Setting slot to null breaks the probe chain, causing search failures for keys after deleted slot.
Step 2: Use special 'deleted' marker
Marking slot as 'deleted' allows probing to continue while allowing new insertions.
Final Answer:
Mark the slot as a special 'deleted' marker instead of null to continue probing. -> Option B
Quick Check:
Deleted marker keeps probe chain intact [OK]
Hint: Use 'deleted' marker slot, not null, after deletion [OK]
Common Mistakes:
Setting slot to null breaks search chain
Rehashing entire table unnecessarily
Ignoring deletion impact on probing
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.