An algorithm is a way to represent solutions to a particular problem in a very simple and efficient way. It is a set of operations for solving the problems for calculation, data processing, and automated reasoning tasks. If we have an algorithmic problem then we can implement it in any other programming language.

The algorithm is independent of any other programming language. It is an efficient method that can be expressed within a finite amount of time and space. Different approaches can be followed to solve a problem, some of them can be efficient with respect to time consumption, whereas other approaches may be memory efficient. We have to know that both time consumption and memory usage cannot be optimized at the same time.

**Need Of Algorithm**

- A good design can produce a good solution.
- To understand the basic idea of the problem.
- To improve the efficiency of existing techniques.
- To find an approach to solve the problem.
- To compare the algorithm’s performance with other techniques.
- To understand the basic principles of designing the algorithm.
- Without describing the implementation detail it is the best method of description.
- A good design pattern course online can produce a good solution.
- The algorithm gives a clear description of the requirements and goals of the problem to the designer.
- To understand the flow of the problem.
- To understand the principle of designing.
- To measure the behavior of methods in the worst case, best case, average cases.
- We can measure and analyze the complexity of the problems.

**Algorithm Design Technique**

Here is a list of several popular design approaches:

**Divide And Conquer Approach**

It is a top-down approach. The divide and conquer technique involves three steps:

- Divide the original problem into a subproblem.
- Solve every subproblem individually
- Combine the solution of subproblems into a solution of whole original problems.

**Randomized algorithm**

It is an algorithm system design training online that accesses a source of independent, unbiased random bits, and then these random bits to influence its computation.

**Dynamic Programming**

It is a bottom-up approach. We solve all small problems and then combine them to obtain a solution to bigger problems.

When the number of copying subproblems is exponentially large, this is very helpful. It is frequently related to optimization problems.

**Backtracking algorithm**

This algorithm tries each possible until finding the right one. It is the depth-first approach of the set of all possible solutions. If an alternative doesn’t work during the search, then backtrack to the choice point, the place which presented different alternatives, and try the next alternatives.

**Branch and bound**

A given subproblem in a branch and bound that cannot be bounded has to be divided into at least two restricted subproblems. It is a method for global optimization in non-convex problems. Sometimes, the branch and the bound algorithm can be slow, however in the worst case they require effort that grows with problem size, but we are lucky in some cases the method coverage with very little effort.

**Randomized Algorithm**

During the computation, a randomized algorithm uses a number at least once.

**Example 1:** in quicksort, using a random number to choose a pivot.

**Example 2:** trying to factor a large number by choosing a random number as possible divisors.