This repository contains a series of labs aimed at introducing and solidifying knowledge in various data structures and algorithms. Each lab focuses on a specific concept, introducing its theory, and then applying it in practice. (Note: I was not able to extract the pdf descriptions from mimir so I had to take screenshots. They will be at the bottom of this readme).
Purpose: This lab serves as an introduction to Python programming. It covers basic Python syntax, data types, control structures, functions, and other fundamental concepts.
Implementation: We implemented various simple functions and data manipulation tasks using Python's built-in data types and control structures. This laid the foundation for the future labs and the rest of the Python programming journey.
Purpose: The second lab introduces strategic game theory, encapsulated in a "Princess Bride"-inspired game.
Implementation: We implemented different strategies for predicting an opponent's moves based on their previous actions, using conditional logic and basic Python data structures.
Purpose: The Ngrams lab introduces text processing concepts and basics of natural language processing.
Implementation: We implemented N-grams, a basic model for predicting the next item in a sequence, to generate new text based on an existing corpus of text.
Purpose: This lab introduces the ArrayList data structure, a fundamental and versatile data structure in computer science.
Implementation: We implemented an ArrayList from scratch, including methods for adding and removing elements, retrieving elements at a particular index, and resizing the array as necessary for space efficiency.
Purpose: In this lab, we explore the LinkedList data structure, another fundamental data structure with unique characteristics and use-cases.
Implementation: We implemented a LinkedList from scratch, building a node-based structure with methods for adding, removing, and retrieving elements, and traversing the list.
Purpose: The Hashtable lab introduces the concept of hashing and the use of hashtables as a highly efficient data structure for storing and retrieving data.
Implementation: We implemented a Hashtable, along with appropriate hashing functions. The implementation includes methods for inserting, retrieving, and deleting elements, managing collisions, and resizing the hashtable for efficiency.
Purpose: This lab focuses on Stacks and Queues, both abstract data types that represent a collection of elements with specific rules for addition and removal.
Implementation: We implemented both Stacks (LIFO - Last In First Out) and Queues (FIFO - First In First Out), with methods for adding elements, removing elements, and checking if the structure is empty.
Purpose: The Heaps lab focuses on the Heap data structure, a specialized tree-based structure that satisfies the heap property.
Implementation: We implemented a binary heap with methods for inserting elements, deleting elements, and heapify operations. We further explored the use of heaps in sorting (heapsort).
Purpose: This lab introduces the concept of recursion, a method where the solution to a problem depends on solutions to smaller instances of the same problem.
Implementation: We implemented various recursive functions and algorithms, such as factorial calculation, Fibonacci sequence generation, and recursive tree traversal.
Purpose: This lab introduces Binary Search Trees (BST), a tree-based data structure with properties that make searching for elements extremely efficient.
Implementation: We implemented a binary search tree, complete with insertion, deletion, and searching methods. This included traversal methods and an understanding of the concepts of tree balance.
Purpose: The optional AVL Tree lab extends the concept of BSTs to introduce
I will also attach screen shots below: