will primarily be concerned with developing algorithms that map easily onto the imperative programming approach algorithms can obviously be described in plain englishand we will sometimes do that howeverfor computer scientists it is usually easier and clearer to use something that comes somewhere in between formatted english and computer program codebut is not runnable because certain details are omitted this is called pseudocodewhich comes in variety of forms often these notes will present segments of pseudocode that are very similar to the languages we are mainly interested innamely the overlap of and javawith the advantage that they can easily be inserted into runnable programs fundamental questions about algorithms given an algorithm to solve particular problemwe are naturally led to ask what is it supposed to do does it really do what it is supposed to do how efficiently does it do itthe technical terms normally used for these three aspects are specification verification performance analysis the details of these three aspects will usually be rather problem dependent the specification should formalize the crucial details of the problem that the algorithm is intended to solve sometimes that will be based on particular representation of the associated dataand sometimes it will be presented more abstractly typicallyit will have to specify how the inputs and outputs of the algorithm are relatedthough there is no general requirement that the specification is complete or non-ambiguous for simple problemsit is often easy to see that particular algorithm will always worki that it satisfies its specification howeverfor more complicated specifications and/or algorithmsthe fact that an algorithm satisfies its specification may not be obvious at all in this casewe need to spend some effort verifying whether the algorithm is indeed correct in generaltesting on few particular inputs can be enough to show that the algorithm is incorrect howeversince the number of different potential inputs for most algorithms is infinite in theoryand huge in practicemore than just testing on particular cases is needed to be sure that the algorithm satisfies its specification we need correctness proofs although we will discuss proofs in these notesand useful relevant ideas like invariantswe will usually only do so in rather informal manner (thoughof coursewe will attempt to be rigorousthe reason is that we want to concentrate on the data structures and algorithms formal verification techniques are complex and will normally be left till after the basic ideas of these notes have been studied finallythe efficiency or performance of an algorithm relates to the resources required by itsuch as how quickly it will runor how much computer memory it will use this will