Collision Handling Using Chaining in DSA C - 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 a key into a hash table using chaining.
// Insert key into hash table with chaining
void insert(HashTable* ht, int key) {
int index = hashFunction(key, ht->size);
Node* newNode = createNode(key);
newNode->next = ht->buckets[index];
ht->buckets[index] = newNode;
}
This code adds a new key at the start of the linked list in the bucket found by the hash function.
In chaining, the main repeating operation happens when searching or deleting keys in a bucket's linked list.
- Primary operation: Traversing the linked list in a bucket.
- How many times: Depends on the number of keys in that bucket, which varies with total keys and hash distribution.
As more keys are added, linked lists in buckets get longer if the table size stays the same.
| Input Size (n) | Approx. Operations (list length) |
|---|---|
| 10 | 1 to 2 |
| 100 | 5 to 10 |
| 1000 | 50 to 100 |
Pattern observation: Without resizing, the linked list length grows roughly proportional to the number of keys, making operations slower.
Time Complexity: O(1 + n/k) where n is total keys and k is number of buckets.
This means operations take constant time plus time proportional to the average number of keys per bucket.
[X] Wrong: "Chaining always gives constant time operations regardless of input size."
[OK] Correct: If many keys hash to the same bucket, the linked list grows, making operations slower than constant time.
Understanding how chaining affects time helps you explain hash table performance clearly and shows you know how to handle collisions well.
What if we doubled the number of buckets as keys increase? How would the time complexity change?
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: Explain chaining method
Chaining stores all collided elements in a linked list at that index, allowing multiple elements per slot.Final Answer:
Store all elements that hash to the same index in a linked list at that index -> Option AQuick Check:
Chaining = linked list at index [OK]
- Confusing chaining with open addressing
- Thinking collisions overwrite existing data
- Believing resizing happens on every collision
Solution
Step 1: Check correct pointer usage in struct
In C, to create a linked list node, the next pointer must be a pointer to the same struct type.Step 2: Validate typedef syntax
typedef struct Node { int key; struct Node* next; } Node; correctly usesstruct Node* next;and typedefs the struct as Node.Final Answer:
typedef struct Node { int key; struct Node* next; } Node; -> Option CQuick Check:
Pointer to struct Node is struct Node* next [OK]
- Using struct Node next instead of pointer
- Missing typedef keyword or incorrect syntax
- Declaring next as int instead of pointer
key % 10?
typedef struct Node {
int key;
struct Node* next;
} Node;
Node* hashTable[10] = {NULL};
void insert(int key) {
int index = key % 10;
Node* newNode = malloc(sizeof(Node));
newNode->key = key;
newNode->next = hashTable[index];
hashTable[index] = newNode;
}
// Insert keys
insert(5);
insert(15);
insert(25);
// Print keys at index 5
Node* temp = hashTable[5];
while(temp != NULL) {
printf("%d -> ", temp->key);
temp = temp->next;
}
printf("NULL\n");Solution
Step 1: Calculate hash index for each key
All keys 5, 15, 25 % 10 = 5, so all go to index 5.Step 2: Trace insertion order in chaining
Each new node is inserted at the head, so order is 25 (last inserted), then 15, then 5.Final Answer:
25 -> 15 -> 5 -> NULL -> Option DQuick Check:
New nodes added at head = 25 -> 15 -> 5 [OK]
- Assuming insertion at tail instead of head
- Miscomputing hash index
- Printing keys in wrong order
void insert(int key) {
int index = key % 10;
Node newNode;
newNode.key = key;
newNode.next = hashTable[index];
hashTable[index] = &newNode;
}Solution
Step 1: Identify variable scope issue
newNode is declared as a local variable on the stack inside insert function.Step 2: Explain why this causes a bug
After function returns, newNode memory is invalid, so hashTable points to invalid memory.Final Answer:
newNode is a local variable and will be lost after function ends -> Option BQuick Check:
Local variable address stored = invalid pointer [OK]
- Ignoring variable lifetime
- Thinking hash function is wrong
- Assuming next pointer assignment is incorrect
key % 7. After all insertions, which index will have the longest chain and what will be the order of keys in that chain if new nodes are inserted at the head?Solution
Step 1: Compute hash index for each key
10 % 7 = 3, 21 % 7 = 0, 17 % 7 = 3, 14 % 7 = 0, 28 % 7 = 0.Step 2: Group keys by index and order insertion at head
Index 0 keys inserted in order: 21, then 14, then 28 (last inserted at head). So chain at index 0 is 28 -> 14 -> 21 -> NULL.
Index 3 keys are 10 and 17.Final Answer:
Index 0: 28 -> 14 -> 21 -> NULL -> Option AQuick Check:
Longest chain at index 0 with keys inserted at head [OK]
- Miscomputing hash indexes
- Mixing up insertion order in chains
- Choosing wrong index for longest chain
Ready to prove it?
Pass the test and this pattern moves unknown
