#### 3] Explain the algorithm design and analysis process

**Algorithm design and analysis process **– We now briefly discuss a sequence of steps one typically goes through in designing and analyzing an algorithm

**Understanding the Problem –**From a practical perspective, the first thing you need to do before designing an algorithm is to understand completely the problem given. An input to an algorithm specifies an instance of the problem the algorithm solves. It is very important to specify exactly the set of instances the algorithm needs to handle.

**Ascertaining the Capabilities of the Computational Device**– Once you completely understand a problem, you need to ascertain the capabilities of the computational device the algorithm is intended for. Select appropriate model from sequential or parallel programming model.-
**Choosing between Exact and Approximate Problem Solving –**The next principal decision is to choose between solving the problem exactly and solving it approximately. Because, there are important problems that simply cannot be solved exactly for most of their instances and some of the available algorithms for solving a problem exactly can be unacceptably slow because of the problem’s intrinsic complexity. **Algorithm Design Techniques**– An algorithm design technique (or “strategy” or “paradigm”) is a general approach to solving problems algorithmically that is applicable to a variety of problems from different areas of computing. They provide guidance for designing algorithms for new problems, i.e., problems for which there is no known satisfactory algorithm.**Designing an Algorithm and Data Structures**– One should pay close attention to choosing data structures appropriate for the operations performed by the algorithm. For example, the sieve of Eratosthenes would run longer if we used a linked list instead of an array in its implementation.*Algorithms + Data Structures = Programs***Methods of Specifying an Algorithm-**Once you have designed an algorithm; you need to specify it in some fashion. These are the two options that are most widely used nowadays for specifying algorithms. Using ahas an obvious appeal; however, the inherent ambiguity of any natural language makes a concise and clear description of algorithms surprisingly difficult.*natural language*is a mixture of a natural language and programming language like constructs. Pseudocode is usually more precise than natural language, and its usage often yields more succinct algorithm descriptions.*Pseudocode***Proving an Algorithm’s Correctness –**Once an algorithm has been specified, you have to prove its correctness. That is, you have to prove that the algorithm yields a required result for every legitimate input in a finite amount of time. For some algorithms, a proof of correctness is quite easy; for others, it can be quite complex. A common technique for proving correctness is to use mathematical induction because an algorithm’s iterations provide a natural sequence of steps needed for such proofs.**Analyzing an Algorithm –**After correctness, by far the most important is. In fact, there are two kinds of algorithm efficiency:*efficiency*, indicating how fast the algorithm runs, and*time efficiency*, indicating how much extra memory it uses. Another desirable characteristic of an algorithm is*space efficiency*. Unlike efficiency, which can be precisely defined and investigated with mathematical rigor, simplicity, like beauty, is to a considerable degree in the eye of the beholder.*simplicity***Coding an Algorithm –**Most algorithms are destined to be ultimately implemented as computer programs. Implementing an algorithm correctly is necessary but not sufficient: you would not like to diminish your algorithm’s power by an inefficient implementation. Modern compilers do provide a certain safety net in this regard, especially when they are used in their code optimization mode.