Collision Handling Using Open Addressing Linear Probing in DSA C - Time & Space Complexity
We want to understand how long it takes to insert items when collisions happen in a hash table using linear probing.
How does the time to find a free spot grow as the table fills up?
Analyze the time complexity of the following code snippet.
int linearProbingInsert(int hashTable[], int size, int key) {
int index = key % size;
int startIndex = index;
while (hashTable[index] != -1) { // -1 means empty
index = (index + 1) % size;
if (index == startIndex) {
return -1; // Table full
}
}
hashTable[index] = key;
return index;
}
This code tries to insert a key into a hash table using linear probing to handle collisions.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that checks each slot until an empty one is found.
- How many times: In the worst case, it can check every slot once if the table is almost full.
As the table fills, the number of checks grows because more slots are occupied.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 (mostly empty) | 1-2 checks |
| 100 (half full) | 5-10 checks |
| 1000 (almost full) | up to 1000 checks |
Pattern observation: The more full the table, the longer it takes to find an empty slot, growing roughly linearly with table size.
Time Complexity: O(n)
This means in the worst case, the time to insert grows directly with the number of slots in the table.
[X] Wrong: "Insertion always takes constant time because we just compute the hash once."
[OK] Correct: When collisions happen, we may need to check many slots, so insertion time can grow with table fullness.
Understanding how collision handling affects insertion time helps you explain trade-offs in hash table design clearly and confidently.
"What if we changed linear probing to quadratic probing? How would the time complexity change?"
Practice
linear probing in collision handling for hash tables?Solution
Step 1: Understand linear probing concept
Linear probing handles collisions by checking the next slot in the array sequentially when the desired slot is occupied.Step 2: Compare options with definition
If a collision occurs, check the next slot sequentially until an empty slot is found. correctly describes this sequential checking. Other options describe different collision handling methods.Final Answer:
If a collision occurs, check the next slot sequentially until an empty slot is found. -> Option AQuick Check:
Linear probing = sequential slot check [OK]
- Confusing linear probing with chaining
- Thinking rehashing happens on every collision
- Assuming table size doubles automatically
m when current index is i?Solution
Step 1: Recall linear probing formula
Linear probing moves to the next slot by adding 1 to the current index and taking modulo with table size.Step 2: Match formula with options
next_index = (i + 1) % m matches this formula: (i + 1) % m. Other options use incorrect increments.Final Answer:
next_index = (i + 1) % m -> Option DQuick Check:
Linear probing next index = (i + 1) mod m [OK]
- Using multiplication instead of addition
- Subtracting instead of adding
- Adding a number other than 1
h(k) = k % 5. Insert keys 7, 12, 17 in order. What is the final state of the table?Solution
Step 1: Calculate initial positions using hash function
h(7) = 7 % 5 = 2, h(12) = 12 % 5 = 2, h(17) = 17 % 5 = 2.Step 2: Insert keys using linear probing
Insert 7 at index 2. For 12, index 2 is occupied, so try index 3. Insert 12 at index 3. For 17, indices 2 and 3 are occupied, so insert at index 4.Final Answer:
[null, null, 7, 12, 17] -> Option CQuick Check:
Keys placed at 2, 3, 4 sequentially [OK]
- Placing all keys at same index ignoring collisions
- Not wrapping around table size
- Misplacing keys at wrong indices
int hash(int key, int size) { return key % size; }
void insert(int table[], int size, int key) {
int index = hash(key, size);
while (table[index] != -1) {
index = (index + 1) % size;
}
table[index] = key;
}
Solution
Step 1: Analyze the insert function logic
The function checks for empty slots by comparing with -1, so the table must be initialized with -1 to mark empty slots.Step 2: Identify missing initialization
If the table is not initialized with -1, the condition table[index] != -1 may fail incorrectly, causing wrong insertions or infinite loops.Final Answer:
The table is not initialized with -1 for empty slots. -> Option BQuick Check:
Empty slots must be marked -1 [OK]
- Ignoring table initialization
- Wrong loop condition in while
- Incorrect hash function usage
h(k) = k % 7. After all insertions, what is the content of the table?Solution
Step 1: Calculate initial indices for each key
h(10)=3, h(20)=6, h(15)=1, h(7)=0, h(32)=4.Step 2: Insert keys using linear probing
Insert 10 at index 3. Insert 20 at index 6. Insert 15 at index 1. Insert 7 at index 0. Insert 32 at index 4 (empty). Final table: [7, 15, null, 10, 32, null, 20].Step 3: Match with options
[7, 15, null, 10, 32, null, 20] matches the correct order. Nulls at indices 2 and 5.Final Answer:
[7, 15, null, 10, 32, null, 20] -> Option AQuick Check:
Keys placed at their hash or next free slot [OK]
- Not probing when slot is occupied
- Misplacing keys at wrong indices
- Ignoring table size wrap-around
Ready to prove it?
Pass the test and this pattern moves unknown
