
Explore core data structures and algorithms with C#, covering theory, visual representations, and hands-on implementation across recursion, sorting, searching, trees, hashing, and graphs.
Discover why data structures matter for memory-efficient data storage and access, using linear and non-linear structures such as stacks, queues, linked lists, trees, heaps, and graphs.
Explore why learning algorithms empower solving real computer science problems with finite, efficient steps. Analyze and compare algorithms using mathematical models to predict time and space performance in large networks.
Explore abstract data types (ADTs) by examining data type representation, memory storage, and operations, and see how abstraction in object oriented programming defines ADTs for data structures.
Learn to set up a C# console project in Visual Studio for data structures and algorithms, navigate Solution Explorer, write and run code, and debug errors in the execution environment.
Explore how to analyze algorithms by measuring running time and memory use, comparing approaches with experimental and theoretical methods, and understanding order of growth in data structures and algorithms.
Explore order of growth in algorithms, classify performance as input size grows, ignore constants, and compare linear, logarithmic, n log n, quadratic, cubic, exponential growth leading to asymptotic analysis.
Master asymptotic analysis and order of growth, using Big O, Big Omega, and theta notations, and analyze best, worst, and average cases as input size grows.
Understand the big O notation as an upper bound on function growth, using constants C and n0, with examples like 5n+4 as O(n) and 2^n as an exponential bound.
Understand big omega notation as a lower bound in asymptotic analysis, with constants C and n0, illustrated by f(n)=5n+4 being omega(n).
Explore the practical meanings of big o, big omega, and theta, with a linear search example illustrating worst, best, and average cases and order of growth classifications.
Explore space complexity by examining memory usage in bytes, considering primitive data types, arrays, and two-dimensional arrays, with practical examples of byte calculations.
Explore recursion and its base cases, and contrast it with iterative functions. Learn time complexity via recurrence relations, types of recursions, and solving problems using recursion in unordered data structures.
Compare iteration and recursion by implementing a square calculator in C# with an iterative while loop and a recursive method, and analyze time complexity via recurrence relations.
Analyze the time complexity of a recursive function using a recurrence relation, showing how t(n) = t(n-1) + constant yields O(n) time.
Solve a recurrence relation t(n)=t(n-1)+n via substitution, revealing t(n)=n(n+1)/2 and a quadratic time complexity O(n^2).
Explore tail and head recursion, compare their behaviors with a square calculation example, and distinguish recursion types such as tree and indirect recursion using a C# program.
Explore tree recursion by analyzing a calculate method that calls itself more than once within and after the base condition, tracing calls and deriving exponential time complexity.
Examine indirect recursion, where multiple functions call each other in a circular pattern with a base condition. Assess how termination and time complexity depend on call sequences.
Learn to compute the sum of natural numbers using a recurrence relation and a recursive algorithm, with a base case and analysis of linear time complexity, alongside the direct formula.
Compute the sum of N numbers in C# using a formula, an iterative loop, and a recursive method, with a class, main execution, and console output.
Compute factorials by multiplying from one to n, with exclamation notation. Derive recurrence fact(n) = fact(n-1) * n and fact(0) = 1, then implement recursive and iterative solutions in O(n).
Explore factorial implementation in C# through iterative and recursive methods, examining base cases, loops, and main execution that confirms both approaches yield 120 for five.
Learn how to implement linear search (sequential search) on an array, returning the found index or NotFound (-1) and analyzing its O(n) worst-case performance.
Implement a linear search in C-sharp by creating a search class with a public int linearSearch method that takes array A, length n, and key, returning the index or -1.
Learn how the iterative binary search locates a key in a sorted array by repeatedly comparing the middle element and narrowing the search range.
Learn to implement an iterative binary search in a C# program using an array and a key, via a binary search method that returns the index or -1.
Explain the binary search recursive algorithm on a sorted array using a key and left/right indices, including mid calculation and recursive left/right search, achieving O(log n) time.
Explains implementing binary search using recursion in a C# console program, with a public int binarySearch(int[] a, int key, int l, int r) method and recursive left/right calls.
Explore sorting introduction: compare algorithms like selection, insertion, bubble, merge, quicksort, shell sort, and heapsort; examine bucket sort, radix sort, and stability, with ascending and descending orders.
Explore stable and unstable sorting, and how duplicates affect ordering. Learn when to preserve the original relative order, especially for objects with name and salary, and why stable sorts matter.
Learn selection sort, the simplest sorting method, by repeatedly selecting the minimum element from the unsorted portion and swapping it into its correct leftmost position, as illustrated with weighted barrels.
Explain the selection sort algorithm by iterating rounds, selecting the smallest remaining element, and swapping it into place, and analyze its time complexity and instability.
Demonstrate how insertion sort builds a sorted sequence by inserting each element into its proper position. The video uses a left-to-right barrel analogy to illustrate comparisons and swaps.
Explore how the insertion sort algorithm inserts each element with a key value and moves larger elements to the right, analyzing its stable behavior and O(n^2) worst-case versus O(n) best-case.
Implement insertion sort in C# by writing a class with an insertion sort method using temp and position, and a display to show the array before and after sorting.
Learn how bubble sort compares consecutive elements, swaps when left is greater than right, and bubbles the maximum value to the end, demonstrated with a weight-barrel example.
Explains the bubble sort algorithm, detailing how it compares consecutive elements, swaps as needed, and uses n minus one passes, with stable outcomes and worst-case O(n^2) and best-case O(n).
Explore implementing the bubble sort algorithm in C#, including a Start class, a Bubblesort method, a display method, and a main that shows original and sorted arrays.
Explore shellsort, a gap-based sorting technique related to insertion sort, using progressively smaller gaps, starting at n/2 and halving, to shift elements and achieve a sorted array.
Explore the shellsort algorithm and its use of gaps and insertion sort principles. Assess its time complexity as gaps halve from n/2 to zero and improve sorting.
Implement shell sort in a C# console program, creating a sort class with a Shellsort method, a display method, and a main routine sorting a sample array.
Learn how merge sort uses divide and conquer to split a collection into smaller subsets, sort each part, and merge them into a fully sorted sequence.
Learn how merge sort uses three parameters: array, left index, and right index, uses a divide and conquer approach, recurses to split the array into subsets, and merges the subsets.
Explore the merge algorithm for two sorted subsets, using left, mid, right, and a temporary array B to merge by comparing a[I] and a[J], then copy back to A.
Analyze the complexity of the merge sort algorithm, showing the merge step runs in O(n) time and the overall time is O(n log n) due to recursive halving into subsets.
Implement a C# merge sort by creating the Start class, writing merge sort and merge methods, and adding a display helper to show original and sorted arrays.
Explore how quicksort uses a pivot to partition a collection into smaller left and right subsets, using divide and conquer, then recursively sort each partition to achieve full order.
Sort an array using quicksort with a partition step. Use the first element as pivot, track the low index and the high index, and recursively sort left and right partitions.
Analyze quicksort complexity by tracing partitioning into two subsets and recursive levels, yielding log2 n levels with n comparisons per level; o(n log n) on average and o(n^2) worst case.
Implement and demonstrate quicksort in a C# console app by defining quicksort, partition (with a pivot), and swap methods, using a sample array, and displaying original and sorted results.
Explore the time and space complexities of sorting algorithms, including best, average, and worst cases, covering selection, insertion, bubble, shellsort, merge, and quicksort, with stability notes.
Understand why linked lists, a dynamic data structure, use nodes and links with noncontiguous memory to grow or shrink, unlike fixed-size arrays with memory addresses.
Define a node class with element and next, initialize them with a constructor, then create n1 (seven) and n2 (four) and link n1.next to n2 to form a linked list.
Examine how a linked list uses head and optional tail references to connect nodes via next pointers, enabling traversal from the first to the last node.
Learn to implement the at last method to append nodes in a singly linked list in C#, creating a new node, updating head and tail, and achieving O(1) time.
Display and traverse a linked list from head to tail by following the next references, printing each node's element, using a while loop, with time complexity o(n).
Learn to insert an element at the beginning of a linked list using the at first method, updating head and tail references and ensuring O(1) time.
Implement add-first method in the linked list class using c# to insert an element at the beginning, updating head, tail, and size, with empty and non-empty handling.
Learn to insert a new node anywhere in a linked list using the Add any method, traversing to the target position, and updating links and size, with O(n) time.
Implement the add any method in the linked list class to insert an element at a given position, with validation, traversal to position-1, node linking, and size increment.
Remove the first element of a linked list by updating head to head.next and adjusting tail when the list becomes empty, achieving O(1) time.
Implement the remove first method to delete the head element of a linked list in C#, updating head and size and setting tail to null when the list becomes empty.
Learn to delete the last node in a singly linked list by traversing from head to the node before the tail, updating tail and returning the removed element.
Implement remove last in a linked list by traversing from head to the node before the tail, updating the tail, handling the empty list case, and returning the removed element.
Traverse the list to the node before the target position, then delete by rewiring the previous node to skip the target, returning the removed element with O(n) time.
Learn to remove an element at a given position in a linked list by implementing remove any, validating position, traversing to the predecessor, updating links, and returning removed value.
Learn how to search for an element in a linked list by traversing from head to tail, checking each node, and returning the index or -1.
Implement a search method in a c# linked list class to locate a key by traversing nodes, returning the index or -1 if not found.
Learn to implement inserting elements into a linked list in sorted order by defining an insert sorted method, handling empty lists, and updating node references and size.
Learn circular linked lists where the last node points back to the first, creating a continuous cycle. Compare to linear lists and note single-node behavior.
Learn to traverse a circular linked list from the head using the next reference, printing each node's element and stopping after length iterations to avoid infinite loops, achieving O(n) time.
Learn to implement a circular linked list in C# by creating and displaying nodes, managing head, tail, and size, and adding elements at the end.
Insert at beginning of a circular linked list by creating a new node, linking tail to it, pointing it to head, updating head, and increasing size.
Learn how to implement inserting an element at the beginning of a circular linked list in C#, updating head and tail, linking nodes, and increasing size.
Learn how to insert an element at any position in a circular linked list using the add any method, perform traversal and link updates, and achieve O(n) time.
Implement a circular linked list insert method add any in C#, validating position, linking new nodes, and updating size; demonstrates inserting 20 at pos 3 and 30 at pos 5.
Learn to implement remove first in a circular linked list using C#, deleting the head element, updating the head, tail, and size, and returning the removed value.
Delete the last element in a circular linked list by traversing to the node before the tail, updating the tail, reconnecting to the head, and returning the deleted value.
Implement the remove last method in the circular linked list class to delete the end element, handle empty lists, traverse to last-but-one node, decrement size, and return the removed value.
Delete an element at any position in a circular linked list using the remove any method; traverse to the node before, rewire links, and update size with O(n) time.
Implement a remove any method in a circular linked list to delete an element at a given position by traversing to previous node, updating links, and returning the removed element.
Understand how a doubly linked list stores nodes with references to both the next and previous elements, enabling efficient removal of the last node compared to a singly linked list.
Create nodes of a doubly linked list by defining a node class with element, next, and prev, and initialize them with a constructor.
Create a doubly linked list by adding nodes at last, linking next and prev, and updating head, tail, and size in constant time for each insertion.
Traverse a doubly linked list from head to tail using the next reference, display each element, and analyze the time complexity as O(n).
Implement and display a doubly linked list in C#, with a node class holding data, next, and previous, and a list class with head, tail, size, add last, display, length.
Learn to insert an element at beginning of a doubly linked list in C#, handling empty and non-empty lists, updating head, tail, and next and previous pointers with O(1) time.
Implement the Add first method to insert at the beginning of a doubly linked list in C#. Update head, tail, and links, then demonstrate with a main method inserting 15.
Implement the add any method to insert an element at a given position in a doubly linked list using C#, validating position, updating next and previous links, and incrementing size.
Delete the first node of a doubly linked list by moving the head to the next node, updating the new head's prev and tail when needed, and adjusting size (O(1)).
Implement the remove first method for the doubly linked list to delete the first node, update head and size, adjust tail when empty, and return the removed element.
Remove the last element of a doubly linked list using the tail and prev references, update the tail, set its next to null, decrement size, and return the deleted element.
Implement a remove last method in a doubly linked list in C#, returning the removed element, handling empty lists, and updating tail, next, and size using the prev reference.
Delete an element at any arbitrary position in a doubly linked list by traversing to the node before it and updating next and prev links.
Learn to implement a remove any method in a doubly linked list that deletes a node at a given position, validates the position, updates links, and returns the removed element.
Learn the stack data structure, a last-in, first-out collection with push and pop, top and is empty operations, implemented via arrays or linked lists, with uses in browser history.
Explore implementing stacks with arrays, including push, pop, and top operations, while checking for full and empty conditions and updating the top index.
Implement stacks using an int array, with push, pop, peak, length, isEmpty, isFull, and display operations, managed by a top index and constructor to set capacity.
Explore implementing stacks with a linked list, a node class to support push, pop, and top operations. Compare head versus tail placement for constant time insertions and linear time removals.
Implement stacks using a linked list in C#, building a node-based top and size tracking. Develop push, pop, peek, is empty, length, and display operations to manage LIFO data.
Explore the queue data structure and its first in, first out behavior, with enqueue and dequeue operations at the rear and front, plus real-world and computer applications.
Implement queues with arrays to enforce first in, first out and manage full or empty states, with enqueue at rear and dequeue from front updating rear, front, and size.
Learn how to implement a first in first out queue using a C# array, with front and rear indexes, size tracking, and operations like insert, remove, isEmpty, isFull, and display.
Implement a queue using a linked list with front and rear pointers and a node class; enqueue at the rear and dequeue from the front in O(1) time, illustrating fifo.
implement a queue in c# using a linked list by defining a node class, managing front and rear, and supporting enqueue, dequeue, length, isEmpty, and display.
Explore double ended queues, or deques, an abstract data type with insertions and deletions at both ends, using first, last, remove first, remove last, length, and is empty.
Implement a double-ended queue with a linked list in C#, renaming head to front and tail to rear, and implementing add first, add last, remove first, and remove last.
This course will help you in better understanding of the basics of Data Structures and how algorithms are implemented in C#. This course consists of Videos which covers the theory concepts + implementation in C#.
There’s tons of concepts and content in this course:
Basics of data structures & Algorithms
Analysis of Algorithms (Big O, Time and Space complexity)
Recursion & Analysis of Recursive Algorithms
Searching Algorithms
Sorting Algorithms
Linked List
Stacks
Queues
Binary Trees
Binary Search Trees
Balanced Binary Search Trees
Priority Queues and Heaps
Hashing
Graphs
Graph Traversal Algorithms
Followed by Advanced Topics of Algorithms:
Sets and Disjoint Sets
Divide and Conquer Approach - Introduction
Divide and Conquer - Binary Search
Divide and Conquer - Finding Maximum and Mininum
Divide and Conquer - Merge Sort
Divide and Conquer - Quick Sort
Divide and Conquer - Selection Algorithm
Divide and Conquer - Strassens Matrix Multiplication
Divide and Conquer - Closest Pair
Divide and Conquer - Convex Hull
Greedy Method - Introduction
Greedy Method - Knapsack Problem
Greedy Method - Job Sequencing with Deadlines
Greedy Method - Mininum Cost Spanning Tree (Prim's & Kruskal's Algorithms)
Greedy Method - Optimal Storage on Trees
Greedy Method - Optimal Merge Pattern
Greedy Method - Single Source Shortest Path (Dijkstra's Algorithm)
Dynamic Programming - Introduction
Dynamic Programming - Multistage Graphs
Dynamic Programming - All Pairs Shortest Path
Dynamic Programming - Single Source Shortest Path
Dynamic Programming - Optimal Binary Search Trees
Dynamic Programming - 0/1 Knapsack Problem
Dynamic Programming - Reliability Design
Dynamic Programming - Travelling Salespersons Problem
Backtracking - Introduction
Backtracking - n-Queesn Problem
Backtracking - Sum of Subsets Problem
Backtracking - Graph Coloring Problem
Backtracking - Hamiltonian Cycles Problem
Backtracking - 0/1 Knapsack Problem
Branch & Bound - Introduction
Branch & Bound - n-Queens Problem
Branch & Bound - Job Sequencing Problem
Branch & Bound - 0/1 Knapsack Problem
Again, each of these sections includes detailed videos tutorial.