moving beyond experimental analysis our goal is to develop an approach to analyzing the efficiency of algorithms that allows us to evaluate the relative efficiency of any two algorithms in way that is independent of the hardware and software environment is performed by studying high-level description of the algorithm without need for implementation takes into account all possible inputs counting primitive operations to analyze the running time of an algorithm without performing experimentswe perform an analysis directly on high-level description of the algorithm (either in the form of an actual code fragmentor language-independent pseudo-codewe define set of primitive operations such as the followingassigning an identifier to an object determining the object associated with an identifier performing an arithmetic operation (for exampleadding two numberscomparing two numbers accessing single element of python list by index calling function (excluding operations executed within the functionreturning from function formallya primitive operation corresponds to low-level instruction with an execution time that is constant ideallythis might be the type of basic operation that is executed by the hardwarealthough many of our primitive operations may be translated to small number of instructions instead of trying to determine the specific execution time of each primitive operationwe will simply count how many primitive operations are executedand use this number as measure of the running time of the algorithm this operation count will correlate to an actual running time in specific computerfor each primitive operation corresponds to constant number of instructionsand there are only fixed number of primitive operations the implicit assumption in this approach is that the running times of different primitive operations will be fairly similar thusthe numbertof primitive operations an algorithm performs will be proportional to the actual running time of that algorithm measuring operations as function of input size to capture the order of growth of an algorithm' running timewe will associatewith each algorithma function (nthat characterizes the number of primitive operations that are performed as function of the input size section will introduce the seven most common functions that ariseand section will introduce mathematical framework for comparing functions to each other