epilogue hopefully the reader will agree that these notes have achieved their objective of introducing the basic data structures used in computer scienceand showing how they can be used in the design of useful and efficient algorithms the basic data structures (arrayslistsstacksqueues and treeshave been employed throughoutand used as the basis of the crucial processessuch as storingsorting and searching datawhich underly many computer science applications it has been demonstrated how ideas from combinatorics and probability theory can be used to compute the efficiency of algorithms as function of problem size we have seen how considerations of computational efficiency then drive the development of more complex data structures (such as binary search treesheaps and hash tablesand associated algorithms general ideas such as recursion and divide-and-conquer have been used to provide more efficient algorithmsand inductive definitions and invariants have been used to establish proofs of correctness of algorithms throughoutabstract data types and pseudo-code have allowed an implementation independent approach that facilitates application to any programming environment in the future clearlythese notes have only been able to provide brief introduction to the topicand the algorithms and data structures and efficiency computations discussed have been relatively simple examples howeverhaving good understanding of these fundamental ideas and design patterns allows them to be easily expanded and elaborated to deal with the more complex applications that will inevitably arise in the future