collections deques chainmaps counter objects ordered dictionaries defaultdict named tuples arrays summary principles of algorithm design algorithm design paradigms recursion and backtracking backtracking divide and conquer long multiplication can we do bettera recursive approach runtime analysis asymptotic analysis big notation composing complexity classes omega notation (ohmtheta notation (amortized analysis summary lists and pointer structures arrays pointer structures nodes finding endpoints node other node types singly linked lists singly linked list class append operation faster append operation getting the size of the list improving list traversal deleting nodes list search clearing list ii