
Will give you an overview of the course
You must be strong in arithmetic, geometric and logarithmic series before continuing to other lectures.
What is algorithm and why we are analyzing algorithms?
Explore how space complexity measures memory needs, from zero for simple ABC to O(n) for summing an array, and how dynamic versus static memory affects the analysis.
Explore elementary operations and the computation time required for algorithms, learn how time complexity is measured, and analyze constant versus variable running times across machine architectures.
Analyze simple algorithms to compute time complexity, comparing constant time, linear time, and quadratic time, and learn to ignore constants when expressing growth rates as O(1), O(n), or O(n^2).
Analyze time complexity with two examples: a loop where i doubles until 2^i reaches n, yielding O(log n); and a j-driven accumulation where i grows as i+j, leading to O(sqrt(n)).
Explore best, average, and worst case time complexity with a linear search example. Identify bounds and show best case as O(1) and worst and average cases as O(n).
Analyze the bubble sort algorithm, its traditional two-loop design, and its complexity, with worst case O(n^2) and a modified version achieving O(n) in the best case via a swapped flag.
derive recurrence equations for recursive algorithms and solve them to reveal the factorial's running time, illustrating how T(n)=T(n-1)+1 yields the asymptotic complexity.
Explore the recursive approach to computing the nth fibonacci number, with base cases fib(1)=1 and fib(2)=1, and the recurrence fib(n)=fib(n-1)+fib(n-2) and its time recurrence T(n)=T(n-1)+T(n-2)+1.
Learn how to solve a recurrence equation using the iterative method in example 3, tracing base conditions and substitutions to reveal the recurrence pattern and squaring step.
Apply the recursion tree method to solve a recurrence from example 2, analyzing level costs and total work to derive the overall time complexity.
Explore the master's method for solving recurrences, detailing the three cases based on f(n) relative to a growth threshold from log base b of a, with epsilon margins.
Explore the benefits and limits of binary search on sorted data, showing fast log-time search but costly insertions and deletions, and motivate using a binary search tree for efficient updates.
Learn how binary search trees structure keys with at most two children, placing smaller values in the left subtree and larger values in the right subtree.
Demonstrates search in a binary search tree by traversing left or right based on comparisons, locating elements like 7, and analyzing tree height and balance for efficiency.
Learn how insertion in a binary search tree places new elements by comparing with node values, routing left for smaller and right for larger, and inserting at a leaf.
We learn deletion in binary search trees, covering the three cases: leaf nodes, single-child nodes, and nodes with two children, where we replace with the in-order successor.
Examine the disadvantages of binary search trees, showing how sorted insertions create degenerate trees with height n, causing search, insert, delete to degrade to O(n) time.
Explore self-balancing binary trees with a balance factor of -1, 0, or 1 and rotations to keep height low. Learn how insertion and deletion run in logarithmic time.
Explore how AVL tree insertion maintains balance through balance factors and rotations. Learn step-by-step how inserting nodes triggers single and double rotations to restore balance.
Explore AVL tree deletion through step-by-step examples, deleting leaves and nodes, updating balance factors, and applying rotations to restore balance after removals.
Describe red-black trees, including root and leaves black, red nodes having black children, and equal number of black nodes on all root-to-leaf paths, with rotations for insertion and deletion.
Explore insertion in red-black trees, learning how new nodes are colored red, how properties like black height and root color are preserved, and how rotations restore balance.
Explore red-black tree deletion, including locating the in-order successor or predecessor, replacing nodes, and maintaining red-black properties and black height through color adjustments.
Learn about m-ary and k-ary search trees, including node orders, key ranges, and multi-way subtrees, with left, middle, and right partitions and the trade-off between balanced and not self-balancing structures.
Explain the b-tree, its order m, and its core properties: internal nodes have 2 to m children, leaves are on the same level, with minimum and maximum keys per node.
Learn b-tree deletion strategies to maintain tree properties, using deletions, merging nodes, moving keys up and down to preserve node order and balance.
Explore how sets are partitioned into non overlapping subsets and how union and find operations manage membership with a root-based representation in this introduction to algorithm design techniques.
Explore the union operation in disjoint sets, merging two sets and forming a new set of their elements, with notes on when the operation can run in constant time.
Apply the disjoint set find operation to locate the set representative and determine which set an element belongs to, by identifying its root.
Explains depth-first search on a graph by initializing all vertices as white, recursively visiting unvisited neighbors, updating colors, and establishing the time complexity as O(V+E).
Explore topological sorting as a linear ordering of graph vertices to respect dependencies, using finishing times to determine execution order for scheduling and dependency analysis.
Explore Prim's algorithm for constructing a minimum spanning tree from a graph using a priority queue, extract-min operations, and dynamic key and parent updates to grow the tree.
Prim's algorithm builds a minimum spanning tree by initializing vertices, enqueuing them, and repeatedly extracting the min. The caption notes O(V) initializations and O(E log V) total time.
//As you know behind every efficient software there will be an efficient algorithm.
But how do you build an efficient algorithm?
You can choose any of the design techniques such as Divide and Conquer, Dynamic Programming, Greedy Approach, Back Tracking & Branch and Bound.
From the technique listed above which one is suitable for your program/problem?
Take this course then you will be able to choose the right one.
/* This course is for both students and professionals */