 # Best Computer Science Algorithms for beginners

17 August 2023

Here are some interesting topics for computer science algorithms that you could explore: Understanding these algorithms helps in optimizing real-world processes, improving network efficiency, and making informed decisions in various domains.

## Graph Algorithms

Graph algorithms function as specialized tools in computer science, aiding our comprehension and manipulation of relationships between entities. A graph resembles a map comprising nodes connected by edges. These algorithms are like instructions that tell you how to explore the map. Basically they provide the quickest way to get from one place to another.

• Dijkstra’s algorithm – To find the shortest path between two nodes in a weighted graph we use Dijkshtra Algorithm.
• Depth-First Search (DFS) – DFS Algorithm stands for Depth First Search Algorithm. It is a technique used to explore and traverse graphs or trees. It starts from a specific node (or vertex) in the graph and explores as far as possible along each branch before backtracking.
• Breadth-First Search (BFS) – BFS is abbreviated as Breadth First Search. It is an algorithm which helps us move through a graph step by step. It makes sure to visit all the nodes at one level before going to the next level.
• Kruskal’s algorithms – Kruskal’s algorithm to find the minimum cost spanning tree uses the greedy approach.
• Prim’s algorithms – Building a network by always adding the nearest connections from reached points, creating the shortest path between all places.
• Topological sorting – Topological sorting arranges tasks in a sequence where each precedes its dependents, akin to organizing books on a shelf by their reading order.
• Bellman-Ford algorithm for single-source shortest paths – To find the shortest path from one point to all others on a map with varying distances.
• Floyd-Warshall algorithm for all pairs shortest paths – To Find the shortest paths between all points on a map with different distances.

## Sorting and Searching Algorithms

Sorting and Searching is one of the most vital topic in DSA. Storing and retrieving information is one of the most common application of computers now-a-days. According to time the amount of data and information stored and accessed via computer has turned to huge databases. Experts have developed numerous techniques and algorithms to efficiently handle and process information in databases. We refer to the action of searching for a specific data record in the database as “searching.” Additionally, the procedure of arranging the records in a database is termed “sorting”.

• Bubble Sort – it is a way of arranging a list of items in order from smallest to largest. It works by comparing neighboring items and swapping them if they are in the wrong order. The process is repeated until the entire list is sorted. It’s called Bubble Sort.
• Quicksort – Divide-and-conquer algorithm that selects a ‘pivot’ element and partitions the array into two sub-arrays – elements less than the pivot and elements greater than the pivot. These sub-arrays are then recursively sorted.
• Merge sort – A divide-and-conquer algorithm that divides the input list into smaller sublists, sorts them, and then merges them to produce a sorted output. It’s efficient for larger lists.
• Heap sort – Heap Sort creates a binary heap, repeatedly extracts max/min element, and reconstructs heap to achieve efficient sorting.
• Binary search – This algorithm works on sorted lists by repeatedly dividing the search interval in half. It compares the middle element with the target value and adjusts the interval accordingly.
• Radix sort – Radix Sort organizes numbers by sorting digits from least to most significant, avoiding direct value comparisons.
• Counting sort – Counting Sort is a non-comparative sorting algorithm that tallies occurrences to arrange numbers efficiently based on counts

## Dynamic Programming

Dynamic programming is a technique that breaks the problems into sub-problems, and saves the result for future purposes so that we do not need to compute the result again. In other words Dynamic programming is a problem-solving technique that breaks complex problems into smaller subproblems, solving each once and storing solutions to avoid redundant computations, resulting in more efficient solutions.

• Knapsack problem – The knapsack problem poses a combinatorial optimization challenge, requiring the selection of items with varying weights and values to maximize total value within a weight constraint.
• Longest common subsequence – The longest common subsequence (LCS) is a dynamic programming problem aiming to find the longest sequence shared between two or more sequences, often used in text comparison and DNA analysis.
• Edit distance – The edit distance between two strings is the minimum number of operations required to transform one string into the other.
The allowed operations are:

• Add one character to the string.
• Remove one character from the string.
• Replace one character in the string.
• Fibonacci sequence using dynamic programming – It stores previous results to efficiently calculate subsequent Fibonacci numbers, avoiding redundant computations.
• Matrix chain multiplication – It optimally parenthesizes matrix products, reducing the number of scalar multiplications through dynamic programming.

## String Algorithms

String algorithms are tools for working with text data efficiently. They involve tasks like searching, matching, manipulating, and comparing strings. String algorithms are vital in various applications like text processing, data mining, bioinformatics, and more.

• KMP (Knuth-Morris-Pratt) algorithm for pattern matching KMP algorithm efficiently finds a pattern in text by using a prefix-based approach to skip unnecessary comparisons.
• Rabin-Karp algorithm for substring search – Rabin-Karp uses hashing to compare pattern and text substrings, quickly detecting matches while handling potential hash collisions.
• Longest palindromic substring This algo is like Manacher’s, expands around center, finding the greatest symmetric sequence in linear time.
• Trie data structure and its applications – Trie is a tree-like DS for efficient string storage and search, used in autocomplete, spell check, and IP routing.

## Greedy Algorithms

Greedy is an algorithmic paradigm that builds up a solution piece by piece, always choosing the next piece that offers the most obvious and immediate benefit. So the problems where choosing locally optimal also leads to global solution are the best fit for Greedy. Greedy algorithm makes locally optimal choices at each step to construct a globally optimal solution. It’s used in problems like minimum spanning trees, coin change, and scheduling.

• Huffman coding for data compression – Huffman coding compresses data by assigning shorter codes to frequent symbols, reducing overall file size. It’s widely used in lossless compression, like in ZIP files.
• Activity selection problem – Activity selection problem involves choosing maximum non-overlapping activities from a set, based on their start and end times, to optimize resource utilization.
• Fractional knapsack problem – Fractional knapsack problem entails selecting items of different weights and values to maximize total value within a fixed capacity, permitting fractional item selection.
• Job scheduling with deadlines – It aims to complete tasks before their deadlines, maximizing total profit. Greedy approaches like sorting by profit-to-deadline ratio are often used for optimization.

## Geometric Algorithms

In different areas of computer science such as robotics, data analysis, computer graphics, virtual reality and etc we need to deal with the geometric aspect or spatial data. Algorithms addressing these data types are called geometric algorithms.

• Convex hull algorithms (Graham’s scan, Jarvis march) – Convex hull algorithms like Graham’s scan and Jarvis march find the smallest convex polygon enclosing a set of points. Graham’s uses angle sorting, while Jarvis march iterates around vertices.
• Closest pair of points problem – Closest pair of points problem seeks the two closest points in a set, usually solved with divide and conquer methods like the “strip” technique or kd-tree structures.
• Line segment intersection – Line segment intersection determines if two or more line segments in a plane intersect. Algorithms like Bentley-Ottmann use sweep line technique for efficient solutions in O(n log n) time.
• Voronoi diagrams – Voronoi diagrams divide a plane into regions around each data point, optimizing distance-based partitioning. Useful in nearest neighbor searches and mesh generation.

## Hashing and Hash-Based Algorithms

Imagine you have an important file to send, and you want to ensure it will get to the addressee without any changes and in one piece. You could use some trivial methods, like sending it multiple times, contacting the addressee and verifying the file, and so on. But there’s a much better approach: using a hashing algorithm.

• Hash functions and collision resolution strategies – Hash functions map data to fixed size. Collisions occur when different data yields same hash. Strategies like chaining or probing manage collisions by distributing data across storage.
• Hash tables and hash maps – Hash tables and hash maps store data as key-value pairs. They use hash functions to map keys to indices for efficient data retrieval and storage, supporting fast lookups.
• Bloom filters – Bloom filters are space-efficient data structures. They probabilistically test if an element is in a set, with minimal false negatives, suitable for membership queries in large datasets.
• Count-Min Sketch – Count-Min Sketch estimates item frequencies in a data stream. It uses multiple hash functions and a table of counters, suitable for tracking frequent elements with limited memory usage.

Advanced data structures are specialized designs like Fenwick trees, suffix trees, and B-trees. They optimize operations for particular tasks, such as range queries, text processing, and database indexing. Data Structures are used to store and manage data in an efficient and organised way for faster and easy access and modification of Data. Some of the basic data structures are Arrays, LinkedList, Stacks, Queues etc.

• AVL trees and Red-Black trees – AVL trees and Red-Black trees are self-balancing binary search trees. AVL ensures stricter balance, while Red-Black guarantees simpler balancing, both optimizing search and insertion operations.
• B-trees and B+ trees – B-trees and B+ trees are balanced tree structures for efficient disk-based storage. B-trees manage indexes, while B+ trees enhance leaf-node connectivity, enhancing range queries and sequential access.
• Skip lists – Skip lists are probabilistic data structures with multiple levels. They provide fast search, insertion, and deletion operations, making them efficient alternatives to balanced trees for some applications
• Fenwick trees (Binary Indexed Trees) – Fenwick trees, or Binary Indexed Trees, efficiently compute prefix sums and update values in arrays. They use bitwise operations for dynamic range queries, making them useful in algorithms like Fenwick Tree.

## Parallel and Distributed Algorithms

A Parallel algorithm is an algorithm that can execute several instructions simultaneously on different processing devices and then combine all the individual outputs to produce the final results. While a distributed algorithm is an algorithm designed to run on computer hardware constructed from interconnected processors. Distributed algorithms are used in different applications areas of distributed computing. Such as, telecommunications, scientific computing, distributed information processing and real-time process control.

• MapReduce programming model –MapReduce is a distributed programming model. It processes large datasets by dividing tasks into mapping and reducing phases, suitable for parallel computing, such as in Hadoop framework.
• Parallel sorting algorithms – Parallel sorting algorithms concurrently sort data using multiple processors or threads. Examples include parallel quicksort, parallel mergesort, and parallel radix sort, improving sorting performance on multicore systems.
• Parallel graph algorithms – Parallel graph algorithms operate on graph data using multiple processors or threads, enhancing performance. Examples include parallel breadth-first search, parallel shortest path algorithms, and parallel minimum spanning tree algorithms.
• Distributed consensus algorithms (e.g., Paxos, Raft) – Distributed consensus algorithms like Paxos and Raft ensure consistent agreement among nodes in distributed systems, crucial for fault-tolerant and reliable operations.

## Randomized Algorithms

Randomized algorithm is a different design approach taken by the standard algorithms, where few random bits are added to a part of their logic. They are different from deterministic algorithms; deterministic algorithms follow a definite procedure to get the same output every time an input is passed. where randomized algorithms produce a different output every time they’re executed. It is important to note that it is not the input that is randomized, but the logic of the standard algorithm.

• Randomized quicksort – Randomized quicksort partitions data using a random pivot, improving worst-case behavior. It’s a fast sorting algorithm with an average-case time complexity of O(n log n).
• Randomized selection algorithm – Randomized selection algorithm finds the kth smallest element in an array by repeatedly partitioning with a random pivot, reducing time complexity to linear O(n) on average.
• Monte Carlo and Las Vegas algorithms – Monte Carlo algorithms use randomness to approximate solutions, with variable accuracy. Las Vegas algorithms use randomness for guaranteed correctness, though execution time can vary.
• Primality testing using randomized algorithms – Randomized primality tests like Miller-Rabin use randomness to efficiently check if a number is prime, with a small probability of error.

## Online and Streaming Algorithms

Online algorithms process data piece by piece, making decisions irrevocably. Streaming algorithms handle large datasets incrementally, often with limited memory, to provide approximate answers for various problems.These algorithms have many similarities with online algorithms. Since they both require decisions to be made before all data are available, but they are not identical. Data stream algorithms only have limited memory available. But they may be able to defer action until a group of points arrive. While online algorithms are required to take action as soon as each point arrives.

• Online learning algorithms – Online learning algorithms adapt to new data sequentially. They update models incrementally, suitable for tasks like recommendation systems, fraud detection, and dynamic environments.
• Sliding window algorithms – Sliding window algorithms process data within a fixed-size window, updating efficiently as new data arrives. Useful for tasks like tracking statistics, pattern matching, and data streams.
• Count-distinct estimation in data streams – Count-distinct estimation algorithms approximate the number of unique elements in a data stream using limited memory, like HyperLogLog, for analyzing large-scale datasets with reduced resources.

## Approximation Algorithms

An Approximate Algorithm is a way of approach NP-COMPLETENESS for the optimization problem. This technique does not guarantee the best solution. The goal of an approximation algorithm is to come as close as possible to the optimum value in a reasonable amount of time. Which is at the most polynomial time. Such algorithms are called approximation algorithm or heuristic algorithm.

• Traveling Salesman Problem approximations – Traveling Salesman Problem approximations use heuristics like nearest neighbor or minimum spanning tree to find near-optimal solutions efficiently, addressing the NP-hard nature of the problem.
• Set cover approximation algorithms – Set cover approximation algorithms, like greedy or LP-rounding, find suboptimal solutions for covering a set with minimum subsets, useful in resource allocation, facility location, and optimization problems.
• Vertex cover approximations – Vertex cover approximation algorithms, such as greedy or LP-rounding, find near-optimal solutions. For the minimum vertex cover problem, vital in optimization, network design, and algorithmic analysis.

## Network Flow Algorithms

Network flow problems are central problems in operations research, computer science, and engineering and they arise in many real world applications. Starting with early work in linear programming and spurred by the classic book of Ford and Fulkerson , the study of such problems. Which has led to continuing improvements in the efficiency of network flow algorithms. Network flow algorithms, like Ford-Fulkerson and Edmonds-Karp. Use to solve problems involving directed graphs by optimizing the flow of goods, information, or resources through nodes and edges.

• Ford-Fulkerson algorithm – Ford-Fulkerson algorithm augments flows along augmenting paths in residual graphs to find maximum flows in network flow problems, utilizing depth-first or breadth-first searches.
• Max-flow min-cut theorem – Max-flow min-cut theorem states that in a flow network. The maximum flow value equals the minimum capacity of a cut, providing a fundamental connection between flows and cuts.
• Push-relabel algorithms – Push-relabel algorithms optimize flow networks by pushing flow from higher-level nodes to lower ones while maintaining a preflow, achieving efficient maximum flow solutions.

## Cryptography Algorithms

Cryptography is the study of encrypting and decrypting data to prevent unauthorized access. The ciphertext should be known by both the sender and the recipient. With the advancement of modern data security. We can now change our data such that only the intended recipient can understand it. Cryptography allows for the secure transmission of digital data between willing parties. It is used to safeguard company secrets, secure classified information, and sensitive information from fraudulent activity, among other things. Crypto means hidden and graph means writing.

• RSA encryption and decryption – RSA encryption uses recipient’s public key for encoding, while decryption employs recipient’s private key. Ensuring secure communication and data protection via asymmetric encryption.
• Diffie-Hellman key exchange – Diffie-Hellman key exchange allows two parties to securely share a secret key. Over an insecure channel using modular exponentiation, ensuring private communication in public networks.
• Elliptic curve cryptography – Elliptic curve cryptography utilizes the mathematical properties of elliptic curves. For secure key exchange, digital signatures, and encryption, offering efficient and robust cryptographic solutions
• AES (Advanced Encryption Standard) – AES is a widely used symmetric encryption algorithm. It operates on fixed-size blocks and supports various key lengths. Ensuring secure data confidentiality in applications like secure communication and data storage.

## Algorithmic Game Theory

Algorithmic Game Theory combines algorithms and game theory to study strategic interactions. It analyzes complexity, equilibria, and incentives in settings ranging from auctions and networks to online markets, enhancing our understanding of computational and economic aspects in decision-making scenarios.

• Nash equilibrium and algorithmic aspects of game theory Nash equilibrium is a solution concept in game theory where players’ strategies are optimal given opponents’ choices. Finding Nash equilibria involves algorithmic challenges, like polynomial-time algorithms for specific cases and complexity bounds in general games
• Auction algorithms and mechanism design Auction algorithms allocate resources through bidding, considering incentives and fairness. Mechanism design creates rules and auctions for desired outcomes, crucial in economic and multi-agent systems.