Data Structures & Algorithms Artifact

This artifact seeks to update a Binary Search Tree (BST) implementation in CPP to a modern, modular, and robust Python module. I enhance it by first refactoring to a Python codebase, then adding two additional sorting methods. Finally, I test the efficacy and efficiency of each by running Big-O analysis on each method.

Code Review

Artifacts

Original Artifact

Original monolithic C++ BST implementation with basic operations.

Enhanced Artifact

Refactored modular Python module with enhanced BST functionality, as well as linked and dictionary list traversal algorithms. Includes Big-O analysis and unit tests to demonstrate efficiency of each algorithm.

Narrative

Description

The artifact I selected for this category is my implementation of a binary-search tree for my CS-300: Data Structures and Algorithms (DSA) course. The original project was a CPP program that utilized a Binary Search Tree sort method to sort a list of courses and their pre-requisites.

For this enhancement, I began by refactoring the code for the BST from a CPP implementation to a Python one. This approach allowed me to build my enhancement in a clean and modular fashion, while also taking advantage of the efficiency of Python. From there I also built out modules for linked and dictionary list sorting, i/o, and benchmarking the algorithms. I compiled everything into a central CourseManager facade that unifies the access to all three of the algorithmic structures. My main class then utilizes the facade to execute user inputted actions.

Justification For Inclusion

I chose this artifact because it strongly demonstrates my skills in algorithms, data structures, code maintainability, and adaptation. These topics are at the core of computer science and represent fundamental competencies that employers may expect.

As such this artifact showcases:

  • Algorithmic Principles: Implementation of insertion, traversal, and search logic for a BST, linked list, and dictionary lookups.
  • Data Structure Design: My ability to compare trade-offs between different structures in terms of both lookup and sorting performance.
  • Software Engineering: My ability to refactor from an antiquated codebase into a modular package with reusable modules and clear separation of concerns.
  • Performance Analysis: My ability to create benchmarking functions that empirically validate time complexities, showing applied understanding of Big-O analysis. As well as my ability to identify the best-case algorithm for a specific data paradigm.


Overall my enhancements improved clarity, maintainability, and efficiency by transforming a single large file into a well-organized package that utilizes a more memory efficient language. The addition of the two algorithms as well as benchmarks also shows my understanding of algorithmic structure, and how I can approach different challenges.

Course Outcomes and Enhancement Alignment

This enhancement aligns with the following course outcomes:

  • Design and evaluate computing solutions that solve a given problem using algorithmic principles and computer science practices. The artifact implements and compares multiple solutions for retrieving and sorting data.
  • Demonstrate ability to use well-founded and innovative techniques, skills, and tools in computing practices. The refactoring into modular Python code with benchmarking illustrates software engineering practices.
  • Design, develop, and deliver professional-quality written and visual communications: The structure, comments, and benchmarking outputs provide a clear narrative of algorithmic performances.

Reflection on the Enhancement Process

Enhancing this artifact gave me the opportunity to deepen both my theoretical and practical understanding of algorithms and data structures. I reinforced my knowledge of how different data structures differ in sorting and retrieval performance. The act of coding them in a side-by-side fashion and running benchmarks clarified not just their time complexity on paper, but also their real-world runtime trade offs.

One of the biggest challenges I faced was reorganizing and refactoring the original one file program into a modular Python problem. I specifically had issues with the init of the module through my CLI. Another challenge was designing the benchmarking framework so that results were consistent and statistically meaningful.

Overall, this enhancement taught me the importance of clean architecture and modularity in professional codebases. I also gained more practical confidence in bridging the theory of Big-O complexity with experimental validation, an important skill for both academia and the industry.