#include #include #include // Top 3 Packing Algorithms Implementation // 1. First Fit Decreasing (FFD) - Bin Packing Algorithm int compare_desc(const void *a, const void *b) { return (*(int*)b - *(int*)a); } int firstFit(int bins[], int n, int c) { int res = 0; for (int i = 0; i < n; i++) { int j; for (j = 0; j < res; j++) { if (bins[j] >= bins[i]) { bins[j] -= bins[i]; break; } } if (j == res) { bins[res] = c - bins[i]; res++; } } return res; } void firstFitDecreasing(int items[], int n, int capacity) { // Sort items in decreasing order qsort(items, n, sizeof(int), compare_desc); printf("First Fit Decreasing Algorithm:\n"); printf("Number of bins required: %d\n", firstFit(items, n, capacity)); } // 2. Huffman Coding - Compression Algorithm struct MinHeapNode { char data; unsigned freq; struct MinHeapNode *left, *right; }; struct MinHeap { unsigned size; unsigned capacity; struct MinHeapNode** array; }; struct MinHeapNode* newNode(char data, unsigned freq) { struct MinHeapNode* temp = (struct MinHeapNode*)malloc(sizeof(struct MinHeapNode)); temp->left = temp->right = NULL; temp->data = data; temp->freq = freq; return temp; } struct MinHeap* createMinHeap(unsigned capacity) { struct MinHeap* minHeap = (struct MinHeap*)malloc(sizeof(struct MinHeap)); minHeap->size = 0; minHeap->capacity = capacity; minHeap->array = (struct MinHeapNode**)malloc(minHeap->capacity * sizeof(struct MinHeapNode*)); return minHeap; } void swapMinHeapNode(struct MinHeapNode** a, struct MinHeapNode** b) { struct MinHeapNode* t = *a; *a = *b; *b = t; } void minHeapify(struct MinHeap* minHeap, int idx) { int smallest = idx; int left = 2 * idx + 1; int right = 2 * idx + 2; if (left < minHeap->size && minHeap->array[left]->freq < minHeap->array[smallest]->freq) smallest = left; if (right < minHeap->size && minHeap->array[right]->freq < minHeap->array[smallest]->freq) smallest = right; if (smallest != idx) { swapMinHeapNode(&minHeap->array[smallest], &minHeap->array[idx]); minHeapify(minHeap, smallest); } } int isSizeOne(struct MinHeap* minHeap) { return (minHeap->size == 1); } struct MinHeapNode* extractMin(struct MinHeap* minHeap) { struct MinHeapNode* temp = minHeap->array[0]; minHeap->array[0] = minHeap->array[minHeap->size - 1]; --minHeap->size; minHeapify(minHeap, 0); return temp; } void insertMinHeap(struct MinHeap* minHeap, struct MinHeapNode* minHeapNode) { ++minHeap->size; int i = minHeap->size - 1; while (i && minHeapNode->freq < minHeap->array[(i - 1) / 2]->freq) { minHeap->array[i] = minHeap->array[(i - 1) / 2]; i = (i - 1) / 2; } minHeap->array[i] = minHeapNode; } void buildMinHeap(struct MinHeap* minHeap) { int n = minHeap->size - 1; for (int i = (n - 1) / 2; i >= 0; --i) minHeapify(minHeap, i); } int isLeaf(struct MinHeapNode* root) { return !(root->left) && !(root->right); } struct MinHeap* createAndBuildMinHeap(char data[], int freq[], int size) { struct MinHeap* minHeap = createMinHeap(size); for (int i = 0; i < size; ++i) minHeap->array[i] = newNode(data[i], freq[i]); minHeap->size = size; buildMinHeap(minHeap); return minHeap; } struct MinHeapNode* buildHuffmanTree(char data[], int freq[], int size) { struct MinHeapNode *left, *right, *top; struct MinHeap* minHeap = createAndBuildMinHeap(data, freq, size); while (!isSizeOne(minHeap)) { left = extractMin(minHeap); right = extractMin(minHeap); top = newNode('$', left->freq + right->freq); top->left = left; top->right = right; insertMinHeap(minHeap, top); } return extractMin(minHeap); } void printArr(int arr[], int n) { printf("Huffman Codes:\n"); for (int i = 0; i < n; ++i) printf("%d ", arr[i]); printf("\n"); } void printCodes(struct MinHeapNode* root, int arr[], int top) { if (root->left) { arr[top] = 0; printCodes(root->left, arr, top + 1); } if (root->right) { arr[top] = 1; printCodes(root->right, arr, top + 1); } if (isLeaf(root)) { printf("%c: ", root->data); printArr(arr, top); } } void HuffmanCodes(char data[], int freq[], int size) { struct MinHeapNode* root = buildHuffmanTree(data, freq, size); int arr[100], top = 0; printCodes(root, arr, top); } // 3. Run-Length Encoding - Simple Compression Algorithm void runLengthEncoding(char input[]) { int len = strlen(input); printf("Run-Length Encoding:\n"); for (int i = 0; i < len; i++) { int count = 1; while (i < len - 1 && input[i] == input[i+1]) { count++; i++; } printf("%c%d", input[i], count); } printf("\n"); } int main() { printf("Top 3 Packing Algorithms Implementation\n\n"); // Example for First Fit Decreasing int items[] = {10, 60, 20, 30, 70, 40, 50}; int n = sizeof(items)/sizeof(items[0]); int capacity = 100; firstFitDecreasing(items, n, capacity); printf("\n"); // Example for Huffman Coding char arr[] = {'A', 'B', 'C', 'D'}; int freq[] = {5, 9, 12, 13}; int size = sizeof(arr)/sizeof(arr[0]); HuffmanCodes(arr, freq, size); printf("\n"); // Example for Run-Length Encoding char str[] = "aaabbccccdddd"; runLengthEncoding(str); return 0; }