There is no doubt that, the most important skill for a computer scientist is **problem solving**. Learning about algorithms is the great way to improve problem solving skills. Problem solving in computer science is consist of a few steps such as understand the problem, design an algorithm for that, prove correctness of the algorithm, analyse it then finally turn it codes. Well, but what is an algorithm ? Let’s see..

An algorithm is a sequence of unambiguous instructions for solving a problem. It shows step by step how to solve a problem. Therefore, it should be clear, effective, finite and definite. For example, there are two recipe and one of them just says *boil the water* and the other is *boil the water at low heat during 5 minutes*. The first recipe is not clear enough. It is not finite, should the water boils until forever? Should it boils at low heat or high heat ? It is not definite unlikely second recipe.

There are some important points like:

-Each step of an algorithm should be definite.

-A problem may be solve by different algorithms.

-An algoithm can be represented in different ways.

-If there are different algorithms to solve a problem, more efficient one should prefered.

But how to decide which algorithm is more efficient ? There are two criteria to decide that:

**
Space
** It is an important criteria that how much memory is needed to complete the algorithm. An algorithm is not efficient if it creates junks.

**Time
** An efficient algorithm have to complete a given task in required time interval. It is not an efficient algorithm which sum two numbers at two years. There are some ways to measure an algorithm time complexity. An algorithms’ upper bound is expressed with

**BigO notation**. The lower bound is expressed with

**Big Omega notation.**There is one more notation called

**Big Teta notation**which express upper and lower bounds . All these notations called

**Asymptotic notation**. These are important to measure time complexity of an algorithm.