This repository showcases my university projects where I applied knowledge of algorithms, data structures, dynamic programming, the theory of automata and grammars, multithreading, and concurrent programming in C++.
Each folder corresponds to a separate project. In each folder, you will find:
... .cpp
: File with the program code.README.md
: Auxiliary file with a detailed description of the task.
Language:
- C++
Tools and Techniques:
- GCC/G++: GNU Compiler Collection for compiling C++ programs.
- GDB: GNU Debugger for debugging C++ programs.
- Make: Utility for managing project builds.
- Valgrind: Tool for memory debugging, memory leak detection, and profiling.
- CMake: Tool for managing the build process in a compiler-independent manner.
- Data Structures: Trees (including balanced trees), graphs, hash maps, and various types of heaps.
- Algorithms: Depth-first search (DFS), breadth-first search (BFS), Dijkstra's algorithm, greedy algorithms, QuickSort, MergeSort, HeapSort, and more.
- Dynamic Programming: Techniques for solving complex problems by breaking them down into simpler subproblems.
- Automata and Grammar Theory: Finite automata, regular expressions, grammars, and their applications in text processing, data compression, and parsing.
- Multithreading: Creating and managing multiple threads to perform concurrent tasks.
- Concurrent Programming: Techniques to ensure correct program execution when multiple threads are accessing shared resources.
- Synchronization Mechanisms: Mutexes, condition variables, and other tools to manage access to shared resources.
- Concurrency Control: Preventing data races and ensuring thread-safe operations.
- Algorithm Development: Learn how to develop algorithms to solve complex problems.
- C++ Programming: Convert algorithms into efficient and optimized C++ programs.
- Data Structures: Gain expertise in implementing and using various data structures for performance gains.
- Dynamic Programming: Master dynamic programming techniques and problem-solving approaches.
- Automata Theory: Understand and apply automata and grammar theory in real-world applications.
- Testing and Debugging: Gain practical skills in program testing, debugging, and memory management.
- Multithreading and Concurrency: Develop skills in creating and managing concurrent processes in C++.
- In-depth Algorithm Analysis: Mastery of algorithm complexity analysis and selection of optimal algorithms.
- Data Structure Expertise: Proficiency in a wide range of data structures and their efficient implementation.
- Dynamic Programming Mastery: Strong understanding of dynamic programming principles and techniques.
- Automata and Grammar Theory: Knowledge of finite automata, regular expressions, and grammars.
- Complex Data Structure Handling: Expertise in handling complex data structures like trees, graphs, and hash maps.
- Search and Sorting Algorithms: Implementation and understanding of various search and sorting algorithms.
- Code Optimization: Skills in enhancing code efficiency and minimizing time complexity.
- Multithreading: Ability to design and implement multithreaded applications.
- Concurrent Programming: Proficiency in managing concurrent processes and ensuring thread-safe operations.
- Synchronization and Concurrency Control: Expertise in using synchronization mechanisms to prevent data races and ensure correct program execution.
- Problem Decomposition: Breaking down problems into smaller, solvable subproblems.
- Code Optimization: Enhancing code efficiency and minimizing time complexity.
- Ideal Data Structure Selection: Evaluating and choosing the most suitable structures based on the task.
- Dynamic Programming Approach: Solving problems with overlapping subproblems for optimal outcomes.
- Automata and Grammar Applications: Utilizing theory for text processing, data compression, and compilation.
- Multithreading Techniques: Efficiently managing multiple threads to perform concurrent tasks.
- Concurrency Control: Implementing synchronization mechanisms to ensure thread-safe operations.