# Quick Access

# Introduction

Everything that you do with a computer relies in some way on an algorithm.
Any software (even the most advanced Artificial Intelligence)
are only algorithms put together with some structured data.

That's it: **Algorithms + Data Structures = Software.**

Algorithms define how to operate, what to do precisely to solve a problem. If we relate it to mathematics or physic, then it could mean solving an equation step by step with a recipe (e.g. Robot Solving 1st order equation).

**Learning algorithms do not require you to know any programming language
(algorithms remain the same, only the syntax may change)**;
it only requires you to have an understanding of the steps that are involved.
It is however recommended to know one if you want to implement your
algorithms and see them running.

# Objectives

We will learn how to implement ourselves very useful and
powerful algorithms.
We will cover programming techniques such as :
**complexity, divide and conquer strategy, recursion, fusion, optimization,
string rewriting systems, partition method... **

### What is next?

Once you handle some algorithms concept, you may go further with data structures, complexity, a new programming language and create your piece of software.

# Why are algorithms so important?

Understanding algorithms give you a grand vision of the digital world. Without understanding them, it is difficult to see things from a higher perspective, to predict what could efficiently work or produce unacceptable results.

**The more we know about algorithms,
the better our chances are of finding an excellent way to solve a problem.**
In many cases, a new problem can be reduced to old problems without too much effort.

Many of the problems, **though they may not seem realistic,
require the same set of algorithmic knowledge that comes up every day in the real world**.

## They are way easier to understand than you can imagine

Algorithms are almost always associated with mathematics and all the obscurantisme it inspires. The math is useful but you will not need it most of the time.

## Do not spend any time memorizing algorithms

That's not the point: **instead, try to understand how different algorithms approach
different problems**.
See what makes one approach slow while the other is fast and learn what the tradeoffs are.
**The key is to get insight in how we can make computers do things.**

# References

- The Algorithm Design Manual Book by Steven S Skiena
- Analysis of Sorting Algorithms by Kolmogorov Complexity - Paul Vitányi
- Wikipedia