# Algorithm: Working with Algorithms

## Introduction to Algorithms

• An algorithm is a well-defined sequence of steps or instructions designed to perform a specific task or solve a particular problem.

• Each step in an algorithm is precise and unambiguous, following a logical order. An algorithm should always produce an output, given a valid set of inputs.

• Algorithms are widely used in problem-solving scenarios in mathematics, computer science, engineering and more.

## Characteristics of Algorithms

• Definiteness: Every step in an algorithm is clear and unambiguous.

• Finiteness: The algorithm terminates after a finite time.

• Input: An algorithm has zero or more well-defined inputs.

• Output: An algorithm produces one or more outputs.

• Effectiveness: An algorithm should be simple, generic and practical so that it can deal with all problem instances.

## Designing Algorithms

• Divide and conquer: A problem is divided into smaller sub-problems until they can be solved directly. The solutions to the sub-problems are then combined to give a solution to the original problem.

• Dynamic programming: This methodology is similar to divide and conquer. However, sub-problem solutions are remembered to avoid multiple calculations of the same sub-problem.

• Greedy method: This involves building up a solution to the problem by always choosing the next step that offers the most immediate benefit or profit.

• Backtracking: This approach is used when the problem involves searching a large solution space. It systematically explores all paths in the solution space.

## Algorithm Complexity

• The time complexity of an algorithm quantifies the amount of time taken by the algorithm to run, as a function of the length of the input. It’s usually expressed using Big O notation.

• The space complexity of an algorithm quantifies the amount of space or memory taken by an algorithm to run, as a function of the length of the input.

• In general, the goal is to choose or design algorithms with acceptable time and space requirements.

## Pseudocode and Flowcharts

• Pseudocode is a high-level description of an algorithm. It uses the structural conventions of a programming language but is intended for human reading rather than machine reading.

• A flowchart is a type of diagram that represents an algorithm or process, showing the steps as boxes of various kinds, and their order by connecting these with arrows.

• Both pseudocode and flowcharts are useful tools for designing, understanding and communicating algorithms.