Data Structure: Array retrieve by index: O(1) if(sorted) search (binary): O(log(n)) else search (linear): O(n) retrieve head: O(1) retrieve tail: O(1) enumerate in order: O(n) insert: O(n) insert at head: O(n) insert at tail: O(1) if we have space, O(n) otherwise if(sorted) delete by index: O(n) else delete by index: O(1) (just copy the last item into the hole) delete head: same as above delete tail: O(1) Data Structure: Linked List retrieve by index: O(n) search: O(n) retrieve head: O(1) retrieve tail: O(1) if we have a tail pointer, O(n) otherwise enumerate in order: O(n) insert: O(n) to find the spot, O(1) for the actual insertion insert at head: O(1) insert at tail: O(1) if we have a tail pointer, O(n) otherwise delete by index: O(n) to find the spot, O(1) for the actual deletion delete head: O(1) delete tail: O(1) if the list is doubly-linked and we have a tail pointer, O(n) otherwise Recur left pointer Look at our data Recur on right pointer Data Structure: Tree retrieve by index: O(n log(n)) search: O(log(n)) retrieve head (first item in order): O(log(n)) retrieve root: O(1) retrieve tail (last item in order): O(log(n)) enumerate in order: O(n log(n)) insert: O(log(n)) insert at head: O(log(n)) insert at tail: O(log(n)) delete by index: O(n log(n)) delete head: O(log(n)) delete tail: O(log(n))