diff --git a/Arrays/Anagram_Check_manual_Sol.py b/Arrays/AnagramCheckManualSol.py similarity index 100% rename from Arrays/Anagram_Check_manual_Sol.py rename to Arrays/AnagramCheckManualSol.py diff --git a/Arrays/Anagram_Check_Sorted_Sol.py b/Arrays/AnagramCheckSortedSol.py similarity index 100% rename from Arrays/Anagram_Check_Sorted_Sol.py rename to Arrays/AnagramCheckSortedSol.py diff --git a/Arrays/ArrayFindTheMissingElement_brute_force_sol.py b/Arrays/ArrayFindTheMissingElementBruteForceSol.py similarity index 100% rename from Arrays/ArrayFindTheMissingElement_brute_force_sol.py rename to Arrays/ArrayFindTheMissingElementBruteForceSol.py diff --git a/Arrays/ArrayFindTheMissingElement_hash_table_sol.py b/Arrays/ArrayFindTheMissingElementHashTableSol.py similarity index 100% rename from Arrays/ArrayFindTheMissingElement_hash_table_sol.py rename to Arrays/ArrayFindTheMissingElementHashTableSol.py diff --git a/Arrays/ArrayFindTheMissingElement_takingSumandSubtract_sol.py b/Arrays/ArrayFindTheMissingElementSumSol.py similarity index 100% rename from Arrays/ArrayFindTheMissingElement_takingSumandSubtract_sol.py rename to Arrays/ArrayFindTheMissingElementSumSol.py diff --git a/Arrays/ArrayFindTheMissingElement_XOR_sol.py b/Arrays/ArrayFindTheMissingElementXORSol.py similarity index 100% rename from Arrays/ArrayFindTheMissingElement_XOR_sol.py rename to Arrays/ArrayFindTheMissingElementXORSol.py diff --git a/Arrays/README.md b/Arrays/README.md index 707a82e..8cbf800 100644 --- a/Arrays/README.md +++ b/Arrays/README.md @@ -4,10 +4,10 @@ This directory contains Python implementations of common array-based algorithms ## Contents -- [Anagram Check (Sorted Solution)](Anagram_Check_Sorted_Sol.py): Checks if two strings are anagrams by comparing their sorted versions. -- [Anagram Check (Manual Solution)](Anagram_Check_manual_Sol.py): Checks if two strings are anagrams using a hash table (dictionary) to count character frequencies. -- [Array Find Missing Element (XOR Solution)](ArrayFindTheMissingElement_XOR_sol.py): Efficiently finds a missing element in a shuffled array using bitwise XOR. -- [Array Find Missing Element (Brute Force Solution)](ArrayFindTheMissingElement_brute_force_sol.py): Finds a missing element by sorting both arrays and comparing them. -- [Array Find Missing Element (Hash Table Solution)](ArrayFindTheMissingElement_hash_table_sol.py): Finds a missing element using a hash table (dictionary) to track element counts. -- [Array Find Missing Element (Sum/Subtract Solution)](ArrayFindTheMissingElement_takingSumandSubtract_sol.py): Finds a missing element by calculating the difference between the sums of the two arrays. +- [Anagram Check (Sorted Solution)](AnagramCheckSortedSol.py): Checks if two strings are anagrams by comparing their sorted versions. Complexity: $O(n \log n)$. +- [Anagram Check (Manual Solution)](AnagramCheckManualSol.py): Checks if two strings are anagrams using a hash table (dictionary) to count character frequencies. Complexity: $O(n)$. +- [Array Find Missing Element (XOR Solution)](ArrayFindTheMissingElementXORSol.py): Efficiently finds a missing element in a shuffled array using bitwise XOR. Complexity: $O(n)$. +- [Array Find Missing Element (Brute Force Solution)](ArrayFindTheMissingElementBruteForceSol.py): Finds a missing element by sorting both arrays and comparing them. Complexity: $O(n \log n)$. +- [Array Find Missing Element (Hash Table Solution)](ArrayFindTheMissingElementHashTableSol.py): Finds a missing element using a hash table (dictionary) to track element counts. Complexity: $O(n)$. +- [Array Find Missing Element (Sum/Subtract Solution)](ArrayFindTheMissingElementSumSol.py): Finds a missing element by calculating the difference between the sums of the two arrays. Complexity: $O(n)$. - [Array Pair Sum Solution](ArrayPairSumSol.py): Finds all unique pairs in an array that sum up to a specific value $k$ using a set for $O(n)$ complexity. diff --git a/deque/DequeImple.py b/Deque/DequeImple.py similarity index 100% rename from deque/DequeImple.py rename to Deque/DequeImple.py diff --git a/deque/README.md b/Deque/README.md similarity index 75% rename from deque/README.md rename to Deque/README.md index 046a17f..dd145b4 100644 --- a/deque/README.md +++ b/Deque/README.md @@ -5,3 +5,5 @@ This directory contains Python implementations of the Deque (Double-Ended Queue) ## Contents - [Deque Implementation](DequeImple.py): Basic implementation of a Deque using a Python list. Includes operations like `addFront`, `addRear`, `removeFront`, `removeRear`, `isEmpty`, and `size`. + - `addFront` and `removeFront`: $O(1)$ + - `addRear` and `removeRear`: $O(n)$ (due to list shifting) diff --git a/Error-debug/ErrorExceptions.py b/ErrorHandling/ErrorExceptions.py similarity index 100% rename from Error-debug/ErrorExceptions.py rename to ErrorHandling/ErrorExceptions.py diff --git a/Error-debug/README.md b/ErrorHandling/README.md similarity index 100% rename from Error-debug/README.md rename to ErrorHandling/README.md diff --git a/README.md b/README.md index b8de7d5..d9a7ca4 100644 --- a/README.md +++ b/README.md @@ -35,23 +35,25 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for more details. ## πŸ“– Table of Contents -- [Getting Started](#getting-started) -- [Project Structure](#project-structure) -- [Data Structures](#data-structures) - - [Arrays](#arrays) - - [Linked Lists](#linked-lists) - - [Stacks](#stacks) - - [Queues](#queues) - - [Deque](#deque) - - [Trees](#trees) -- [Algorithms](#algorithms) - - [Sorting](#sorting) - - [Recursion & Dynamic Programming](#recursion--dynamic-programming) - - [Graph Algorithms](#graph-algorithms) -- [Error Handling & Debugging](#error-handling--debugging) -- [Usage](#usage) -- [Quick Reference](#quick-reference) -- [License](#license) +- [About This Repository](#-about-this-repository) +- [Contributing](#-contributing) +- [Getting Started](#-getting-started) +- [Project Structure](#-project-structure) +- [Data Structures](#-data-structures) + - [Arrays](#arrays-) + - [Linked Lists](#linked-lists-) + - [Stacks](#stacks-) + - [Queues](#queues-) + - [Deque](#deque-) + - [Trees](#trees-) +- [Algorithms](#-algorithms) + - [Sorting](#sorting-) + - [Recursion & Dynamic Programming](#recursion--dynamic-programming-) + - [Graph Algorithms](#graph-algorithms-) +- [Error Handling & Debugging](#-error-handling--debugging) +- [Usage](#-usage) +- [Quick Reference](#-quick-reference) +- [License](#-license) --- @@ -67,7 +69,7 @@ Most scripts in this repository are standalone and can be executed directly: ```bash # Run any Python script -python3 Arrays/Anagram_Check_Sorted_Sol.py +python3 Arrays/AnagramCheckSortedSol.py # Or run from the repo root python3 Sorting/BubbleSortImple.py @@ -80,7 +82,8 @@ python3 Sorting/BubbleSortImple.py ``` . β”œβ”€β”€ Arrays/ # πŸ”€ Array-based problems and algorithms -β”œβ”€β”€ Error-debug/ # ⚠️ Error handling and debugging examples +β”œβ”€β”€ Deque/ # πŸ”„ Double-ended queue +β”œβ”€β”€ ErrorHandling/ # ⚠️ Error handling and debugging examples β”œβ”€β”€ GraphAlgorithms/ # πŸ—ΊοΈ Graph traversal (BFS, DFS) and pathfinding β”œβ”€β”€ LinkedLists/ # πŸ”— Singly and Doubly Linked Lists β”œβ”€β”€ Queues/ # πŸ“¦ Queue implementations (FIFO) @@ -88,7 +91,6 @@ python3 Sorting/BubbleSortImple.py β”œβ”€β”€ Sorting/ # πŸ“Š Common sorting algorithms β”œβ”€β”€ Stacks/ # πŸ“š Stack implementations and applications β”œβ”€β”€ Trees/ # 🌳 Binary Trees, BSTs, Heaps, and Traversals -β”œβ”€β”€ deque/ # πŸ”„ Double-ended queue β”œβ”€β”€ CONTRIBUTING.md # 🀝 Contribution guidelines β”œβ”€β”€ LICENSE # πŸ“„ MIT License └── README.md # πŸ“– This file @@ -100,40 +102,40 @@ python3 Sorting/BubbleSortImple.py ### Arrays πŸ”€ Common array-based algorithms and manipulations. -- [Anagram Check](Arrays/): [Sorted](Arrays/Anagram_Check_Sorted_Sol.py) & [Manual](Arrays/Anagram_Check_manual_Sol.py) solutions -- [Array Pair Sum](Arrays/ArrayPairSumSol.py): Find pairs that sum to $k$ -- [Find Missing Element](Arrays/): [XOR](Arrays/ArrayFindTheMissingElement_XOR_sol.py), [Brute Force](Arrays/ArrayFindTheMissingElement_brute_force_sol.py), [Hash Table](Arrays/ArrayFindTheMissingElement_hash_table_sol.py), & [Sum](Arrays/ArrayFindTheMissingElement_takingSumandSubtract_sol.py) approaches +- [Anagram Check](Arrays/): [Sorted](Arrays/AnagramCheckSortedSol.py) ($O(n \log n)$) & [Manual](Arrays/AnagramCheckManualSol.py) ($O(n)$) solutions +- [Array Pair Sum](Arrays/ArrayPairSumSol.py): Find pairs that sum to $k$ ($O(n)$) +- [Find Missing Element](Arrays/): [XOR](Arrays/ArrayFindTheMissingElementXORSol.py) ($O(n)$), [Brute Force](Arrays/ArrayFindTheMissingElementBruteForceSol.py) ($O(n \log n)$), [Hash Table](Arrays/ArrayFindTheMissingElementHashTableSol.py) ($O(n)$), & [Sum](Arrays/ArrayFindTheMissingElementSumSol.py) ($O(n)$) approaches ### Linked Lists πŸ”— Implementations and problems involving linked structures. - [Singly Linked List](LinkedLists/SingleLinkedListImple.py) & [Doubly Linked List](LinkedLists/DoublyLinkedListImple.py) -- [Cycle Detection](LinkedLists/SinglyLinkedListCycleCheckImple.py): Detect cycles using two pointers (Floyd's algorithm) -- [Reverse Linked List](LinkedLists/LinkedListReversal.py): In-place reversal -- [Nth to Last Node](LinkedLists/LinkedListNthToLastNode.py): Find the $n$-th node from the end +- [Cycle Detection](LinkedLists/SinglyLinkedListCycleCheckImple.py): Detect cycles using two pointers (Floyd's algorithm - $O(n)$) +- [Reverse Linked List](LinkedLists/LinkedListReversal.py): In-place reversal ($O(n)$) +- [Nth to Last Node](LinkedLists/LinkedListNthToLastNode.py): Find the $n$-th node from the end ($O(n)$) ### Stacks πŸ“š LIFO (Last-In-First-Out) data structures. -- [Stack Implementation](Stacks/StackImple.py): Basic operations (push, pop, peek) -- [Balanced Parentheses](Stacks/BalanceParenthlessCheckImple.py): Check for balanced brackets using a stack +- [Stack Implementation](Stacks/StackImple.py): Basic operations (push, pop, peek - $O(1)$) +- [Balanced Parentheses](Stacks/BalanceParenthlessCheckImple.py): Check for balanced brackets using a stack ($O(n)$) ### Queues πŸ“¦ FIFO (First-In-First-Out) data structures. -- [Queue Implementation](Queues/QueueImple.py): Basic operations (enqueue, dequeue) -- [Queue with Two Stacks](Queues/QueueWith2StacksImple.py): Implementing FIFO using LIFO structures +- [Queue Implementation](Queues/QueueImple.py): Basic operations (enqueue - $O(n)$, dequeue - $O(1)$) +- [Queue with Two Stacks](Queues/QueueWith2StacksImple.py): Implementing FIFO using LIFO structures (amortized $O(1)$) ### Deque πŸ”„ Double-ended queue operations. -- [Deque Implementation](deque/DequeImple.py): Operations at both ends +- [Deque Implementation](Deque/DequeImple.py): Operations at both ends (`addFront`/`removeFront` - $O(1)$, `addRear`/`removeRear` - $O(n)$) ### Trees 🌳 Hierarchical data structures. -- [Binary Search Tree](Trees/BinarySearchTreesImple.py): Complete BST implementation -- [BST Validation](Trees/): [Solution 1 (In-order)](Trees/BinarySearchTreeCheckImpleSol1.py) & [Solution 2 (Range check)](Trees/BinarySearchTreeCheckImpleSol2.py) -- [Binary Search](Trees/): [Iterative](Trees/BinarySearchImple.py) & [Recursive](Trees/BinarySearchRecursiveImple.py) +- [Binary Search Tree](Trees/BinarySearchTreesImple.py): Complete BST implementation ($O(\log n)$ average) +- [BST Validation](Trees/): [Solution 1 (In-order)](Trees/BinarySearchTreeCheckImpleSol1.py) & [Solution 2 (Range check)](Trees/BinarySearchTreeCheckImpleSol2.py) ($O(n)$) +- [Binary Search](Trees/): [Iterative](Trees/BinarySearchImple.py) & [Recursive](Trees/BinarySearchRecursiveImple.py) ($O(\log n)$) - [Binary Heap](Trees/BinaryHeapImple.py): Min-heap implementation -- [Tree Traversals](Trees/TreeLevelOrderPrintImple.py): Level order (BFS) printing -- [Trim BST](Trees/TrimBinarySearchTreeImple.py): Keep nodes within a range -- [Tree Representations](Trees/): [Nodes & References](Trees/TreeRepresentationWithNodesReferences.py) & [List of Lists](Trees/buildTreeTest.py) +- [Tree Traversals](Trees/TreeLevelOrderPrintImple.py): Level order (BFS) printing ($O(n)$) +- [Trim BST](Trees/TrimBinarySearchTreeImple.py): Keep nodes within a range ($O(n)$) +- [Tree Representations](Trees/): [Nodes & References](Trees/TreeRepresentationWithNodesReferences.py) & [List of Lists](Trees/BuildTreeTest.py) --- @@ -144,31 +146,31 @@ Algorithms for arranging elements in order. - [Bubble Sort](Sorting/BubbleSortImple.py) - $O(n^2)$ - [Selection Sort](Sorting/SelectionSortImple.py) - $O(n^2)$ - [Insertion Sort](Sorting/InsertionSortImple.py) - $O(n^2)$ -- [Shell Sort](Sorting/ShellSortImple.py) - $O(n \log n)$ +- [Shell Sort](Sorting/ShellSortImple.py) - $O(n^2)$ - [Merge Sort](Sorting/MergeSortImple.py) - $O(n \log n)$ - [Quick Sort](Sorting/QuickSortImple.py) - $O(n \log n)$ average ### Recursion & Dynamic Programming πŸ”€ Solving problems by breaking them into smaller sub-problems. -- [Fibonacci Sequence](Recursion/): [Iterative](Recursion/FibonacciSeqIterative.py), [Recursive](Recursion/FibonacciSeqRecursion.py), & [Dynamic Programming](Recursion/FibonacciSeqDynamic.py) -- [Coin Change Problem](Recursion/): [Recursive](Recursion/CoinChangeProblemRecursion.py) & [Dynamic Programming](Recursion/CoinChangeProblemDynamic.py) -- [String Operations](Recursion/): [Reverse](Recursion/RecursionReverseStr.py) & [Permutations](Recursion/RecursionStrPermutation.py) -- [Math Operations](Recursion/): [Cumulative Sum](Recursion/RecursionCumulativeSum.py) & [Sum of Digits](Recursion/RecursionSumOfDigits.py) +- [Fibonacci Sequence](Recursion/): [Iterative](Recursion/FibonacciSeqIterative.py) ($O(n)$), [Recursive](Recursion/FibonacciSeqRecursion.py) ($O(2^n)$), & [Dynamic Programming](Recursion/FibonacciSeqDynamic.py) ($O(n)$) +- [Coin Change Problem](Recursion/): [Recursive](Recursion/CoinChangeProblemRecursion.py) (Exponential) & [Dynamic Programming](Recursion/CoinChangeProblemDynamic.py) ($O(n \cdot m)$) +- [String Operations](Recursion/): [Reverse](Recursion/RecursionReverseStr.py) ($O(n)$) & [Permutations](Recursion/RecursionStrPermutation.py) ($O(n!)$) +- [Math Operations](Recursion/): [Cumulative Sum](Recursion/RecursionCumulativeSum.py) ($O(n)$) & [Sum of Digits](Recursion/RecursionSumOfDigits.py) ($O(\log_{10} n)$) - [Word Split](Recursion/RecursionWordSplit.py): Dynamic Programming solution ### Graph Algorithms πŸ—ΊοΈ Algorithms for graph traversal and pathfinding. - [Adjacency List](GraphAlgorithms/AdjacencyListGraphImple.py): Graph ADT implementation -- [Breadth First Search (BFS)](GraphAlgorithms/BFS.py): Word Ladder problem -- [Depth First Search (DFS)](GraphAlgorithms/DFSGeneral.py): General DFS implementation -- [Knight's Tour Problem](GraphAlgorithms/): [Graph Generation](GraphAlgorithms/TheKnightsTourProblem.py) & [DFS Solution](GraphAlgorithms/DFSImpleTheKnightsTourProblem.py) +- [Breadth First Search (BFS)](GraphAlgorithms/BFS.py): Word Ladder problem ($O(V+E)$) +- [Depth First Search (DFS)](GraphAlgorithms/DFSGeneral.py): General DFS implementation ($O(V+E)$) +- [Knight's Tour Problem](GraphAlgorithms/): [Graph Generation](GraphAlgorithms/TheKnightsTourProblem.py) & [DFS Solution](GraphAlgorithms/DFSImpleTheKnightsTourProblem.py) ($O(k^N)$) - [Word Ladder Problem](GraphAlgorithms/WordLadderProblem.py): Building the word ladder graph --- ## ⚠️ Error Handling & Debugging -- [Error and Exceptions](Error-debug/ErrorExceptions.py): Demonstrates `try`, `except`, `else`, and `finally` blocks for robust error handling. +- [Error and Exceptions](ErrorHandling/ErrorExceptions.py): Demonstrates `try`, `except`, `else`, and `finally` blocks for robust error handling. --- diff --git a/Trees/buildTreeTest.py b/Trees/BuildTreeTest.py similarity index 100% rename from Trees/buildTreeTest.py rename to Trees/BuildTreeTest.py diff --git a/Trees/README.md b/Trees/README.md index 2047225..2ec20a6 100644 --- a/Trees/README.md +++ b/Trees/README.md @@ -5,19 +5,19 @@ This directory contains Python implementations of various tree-based data struct ## Contents ### Binary Search Trees (BST) -- [Binary Search Tree Implementation](BinarySearchTreesImple.py): A comprehensive implementation of a BST with `TreeNode` and `BinarySearchTree` classes, including insertion, deletion, and search. -- [Validate BST (Solution 1)](BinarySearchTreeCheckImpleSol1.py): Validates a BST by performing an in-order traversal and checking if the resulting values are sorted. -- [Validate BST (Solution 2)](BinarySearchTreeCheckImpleSol2.py): Validates a BST by keeping track of the minimum and maximum allowable values for each node. -- [Trim a BST](TrimBinarySearchTreeImple.py): Trims a BST so that all node values fall within a specified range $[min, max]$. +- [Binary Search Tree Implementation](BinarySearchTreesImple.py): A comprehensive implementation of a BST with `TreeNode` and `BinarySearchTree` classes, including insertion, deletion, and search. Average complexity: $O(\log n)$. +- [Validate BST (Solution 1)](BinarySearchTreeCheckImpleSol1.py): Validates a BST by performing an in-order traversal and checking if the resulting values are sorted. Complexity: $O(n)$. +- [Validate BST (Solution 2)](BinarySearchTreeCheckImpleSol2.py): Validates a BST by keeping track of the minimum and maximum allowable values for each node. Complexity: $O(n)$. +- [Trim a BST](TrimBinarySearchTreeImple.py): Trims a BST so that all node values fall within a specified range $[min, max]$. Complexity: $O(n)$. ### Search Algorithms -- [Binary Search (Iterative)](BinarySearchImple.py): Iterative implementation of the binary search algorithm on a sorted list. -- [Binary Search (Recursive)](BinarySearchRecursiveImple.py): Recursive implementation of the binary search algorithm. +- [Binary Search (Iterative)](BinarySearchImple.py): Iterative implementation of the binary search algorithm on a sorted list. Complexity: $O(\log n)$. +- [Binary Search (Recursive)](BinarySearchRecursiveImple.py): Recursive implementation of the binary search algorithm. Complexity: $O(\log n)$. ### Heaps - [Binary Heap Implementation](BinaryHeapImple.py): Implements a min-heap using a recursive approach, including `insert`, `delMin`, and `buildHeap`. ### Tree Representations & Traversals - [Nodes and References Representation](TreeRepresentationWithNodesReferences.py): A simple implementation of a binary tree using a class-based nodes and references approach. -- [List of Lists Representation](buildTreeTest.py): Demonstrates building and manipulating a tree using a "list of lists" approach. +- [List of Lists Representation](BuildTreeTest.py): Demonstrates building and manipulating a tree using a "list of lists" approach. - [Tree Level Order Print](TreeLevelOrderPrintImple.py): Prints a binary tree in level order (breadth-first) using a queue, with each level on a new line.