Thank you for the opportunity to help you with your question!
Students learn about recursive definitions recurrence relations, analyzing recursive algorithms and writing recursive algorithms and programs together in the same course. They study matrices and matrix manipulations in conjunction with the array data structure. They learn about permutations and combinations, relations, graphs, and trees at the same time that their programming knowledge and sophistication are improving and they can do increasingly interesting programming exercises involving these concepts.
- Propositional and predicate logic
- Boolean algebra
- Functions growth of functions big-O notation
- Sequences and summations
- Integers elementary number theory
- Proof techniques direct indirect contradiction induction
- Pigeon hole principle
- Permutations and combinations
- Discrete probability
- Recursive definitions recurrence relations
- Relations : properties applications representation closures equivalence
- Graphs : terminology representation isomorphism connectivity paths
There are several answers to this basic question, depending on one’s frame of reference: the intended use of the algorithm, the importance of the algorithm in relationship to others from both practical and theoretical standpoints, the difficulty of analysis, and the accuracy and precision of the required answer.
The most straightforward reason for analyzing an algorithm is to discover its characteristics in order to evaluate its suitability for various applications or compare it with other algorithms for the same application. The characteristics of interest are most often the primary resources of time and space, particularly time. Put simply, we want to know how long an implementation of a particular algorithm will run on a particular computer, and how much space it will require. We generally strive to keep the analysis independent of particular implementations—we concentrate instead on obtaining results for essential characteristics of the algorithm that can be used to derive precise estimates of true resource requirements on various actual machines.
In practice, achieving independence between an algorithm and characteristics of its implementation can be difficult to arrange. The quality of the implementation and properties of compilers, machine architecture, and other major facets of the programming environment have dramatic effects on performance. We must be cognizant of such effects to be sure the results of analysis are useful. On the other hand, in some cases, analysis of an algorithm can help identify ways for it to take full advantage of the programming environment.
Occasionally, some property other than time or space is of interest, and the focus of the analysis changes accordingly. For example, an algorithm on a mobile device might be studied to determine the effect upon battery life, or an algorithm for a numerical problem might be studied to determine how accurate an answer it can provide. Also, it is sometimes appropriate to address multiple resources in the analysis. For example, an algorithm that uses a large amount of memory may use much less time than an algorithm that gets by with very little memory. Indeed, one prime motivation for doing a careful analysis is to provide accurate information to help in making proper tradeoff decisions in such situations.
The term analysis of algorithms has been used to describe two quite different general approaches to putting the study of the performance of computer programs on a scientific basis. We consider these two in turn.
Please let me know if you nea case for torture by michale levined any clarification. I'm always happy to answer your questions.