├── .gitignore ├── README.md ├── BFS.ipynb ├── DoubleLinkedListSearch.ipynb ├── Outline.txt ├── DoubleLinkedListSearch-InClass.ipynb ├── BFS-InClass.ipynb └── Computational-Complexity.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PDL-Interview 2 | 3 | https://docs.google.com/presentation/d/1Qe7Ro9LZe91HCSRNxmEH5wRAlV7unSDiDZ9BrQvPv4g/ 4 | -------------------------------------------------------------------------------- /BFS.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 5, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "data": { 10 | "text/plain": [ 11 | "Node(5)" 12 | ] 13 | }, 14 | "execution_count": 5, 15 | "metadata": {}, 16 | "output_type": "execute_result" 17 | } 18 | ], 19 | "source": [ 20 | "class Node:\n", 21 | " def __init__(self, value, left=None, right=None):\n", 22 | " self.value = value\n", 23 | " self.left = left\n", 24 | " self.right = right\n", 25 | " \n", 26 | " def __repr__(self):\n", 27 | " return f'Node({self.value})'\n", 28 | "\n", 29 | "# 5\n", 30 | "# 3 10\n", 31 | "# 1 4 7 15\n", 32 | "\n", 33 | "# We want: 5, 3, 10, 1, 4, 7, 15\n", 34 | "\n", 35 | "root = Node(\n", 36 | " 5,\n", 37 | " left=Node(\n", 38 | " 3, \n", 39 | " left=Node(1), \n", 40 | " right=Node(4)\n", 41 | " ),\n", 42 | " right=Node(\n", 43 | " 10, \n", 44 | " left=Node(7), \n", 45 | " right=Node(15)\n", 46 | " )\n", 47 | ")\n", 48 | "\n", 49 | "root" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 6, 55 | "metadata": {}, 56 | "outputs": [], 57 | "source": [ 58 | "def breadth_first_search_print(root) -> list:\n", 59 | " queue = [root]\n", 60 | " return_list = []\n", 61 | " while queue:\n", 62 | " node = queue.pop(0)\n", 63 | "\n", 64 | " if node.left:\n", 65 | " queue.append(node.left)\n", 66 | " \n", 67 | " if node.right:\n", 68 | " queue.append(node.right)\n", 69 | " \n", 70 | " return_list.append(node)\n", 71 | " \n", 72 | " return return_list" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 7, 78 | "metadata": {}, 79 | "outputs": [ 80 | { 81 | "data": { 82 | "text/plain": [ 83 | "[Node(5), Node(3), Node(10), Node(1), Node(4), Node(7), Node(15)]" 84 | ] 85 | }, 86 | "execution_count": 7, 87 | "metadata": {}, 88 | "output_type": "execute_result" 89 | } 90 | ], 91 | "source": [ 92 | "breadth_first_search_print(root)" 93 | ] 94 | } 95 | ], 96 | "metadata": { 97 | "kernelspec": { 98 | "display_name": "Python 3 (ipykernel)", 99 | "language": "python", 100 | "name": "python3" 101 | }, 102 | "language_info": { 103 | "codemirror_mode": { 104 | "name": "ipython", 105 | "version": 3 106 | }, 107 | "file_extension": ".py", 108 | "mimetype": "text/x-python", 109 | "name": "python", 110 | "nbconvert_exporter": "python", 111 | "pygments_lexer": "ipython3", 112 | "version": "3.11.4" 113 | } 114 | }, 115 | "nbformat": 4, 116 | "nbformat_minor": 4 117 | } 118 | -------------------------------------------------------------------------------- /DoubleLinkedListSearch.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "alert-liquid", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "Node(5) <-> Node(10) <-> Node(1) <-> Node(7) <-> Node(8) <-> Node(2)\n", 14 | "head: Node(5)\n", 15 | "tail: Node(2)\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "class Node:\n", 21 | " def __init__(self, value, before=None, after=None):\n", 22 | " self.value = value\n", 23 | " self.before = before\n", 24 | " self.after = after\n", 25 | " \n", 26 | " def __repr__(self):\n", 27 | " return f'Node({self.value})'\n", 28 | " \n", 29 | "\n", 30 | "class DoubleLinkedList:\n", 31 | " def __init__(self):\n", 32 | " self.head = None\n", 33 | " self.tail = None\n", 34 | " \n", 35 | " @property\n", 36 | " def nodes(self):\n", 37 | " node_list = []\n", 38 | " current_node = self.head\n", 39 | " tail = None\n", 40 | " while current_node:\n", 41 | " node_list.append(current_node)\n", 42 | " current_node = current_node.after\n", 43 | " if current_node:\n", 44 | " tail = current_node\n", 45 | " return node_list\n", 46 | " \n", 47 | " def __repr__(self):\n", 48 | " return ' <-> '.join(repr(n) for n in self.nodes)\n", 49 | " \n", 50 | " def append(self, value):\n", 51 | " if len(self.nodes) == 0:\n", 52 | " self.head = Node(value)\n", 53 | " self.tail = self.head\n", 54 | " else:\n", 55 | " self.tail.after = Node(value, before=self.tail)\n", 56 | " self.tail = self.tail.after\n", 57 | "\n", 58 | "\n", 59 | "dll = DoubleLinkedList()\n", 60 | "dll.append(5)\n", 61 | "dll.append(10)\n", 62 | "dll.append(1)\n", 63 | "dll.append(7)\n", 64 | "dll.append(8)\n", 65 | "dll.append(2)\n", 66 | "\n", 67 | "print(dll)\n", 68 | "print('head:', dll.head)\n", 69 | "print('tail:', dll.tail)" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 5, 75 | "id": "satellite-disclosure", 76 | "metadata": {}, 77 | "outputs": [ 78 | { 79 | "data": { 80 | "text/plain": [ 81 | "[Node(1), Node(7)]" 82 | ] 83 | }, 84 | "execution_count": 5, 85 | "metadata": {}, 86 | "output_type": "execute_result" 87 | } 88 | ], 89 | "source": [ 90 | "def get_middle_nodes(dll: DoubleLinkedList) -> []:\n", 91 | " p1 = dll.head\n", 92 | " p2 = dll.tail\n", 93 | "\n", 94 | " while p1 and p2:\n", 95 | " if p1 == p2:\n", 96 | " return [p1]\n", 97 | " elif p1.after == p2:\n", 98 | " return [p1, p2]\n", 99 | "\n", 100 | " else:\n", 101 | " p1 = p1.after\n", 102 | " p2 = p2.before\n", 103 | "\n", 104 | "get_middle_nodes(dll)" 105 | ] 106 | } 107 | ], 108 | "metadata": { 109 | "kernelspec": { 110 | "display_name": "Python 3 (ipykernel)", 111 | "language": "python", 112 | "name": "python3" 113 | }, 114 | "language_info": { 115 | "codemirror_mode": { 116 | "name": "ipython", 117 | "version": 3 118 | }, 119 | "file_extension": ".py", 120 | "mimetype": "text/x-python", 121 | "name": "python", 122 | "nbconvert_exporter": "python", 123 | "pygments_lexer": "ipython3", 124 | "version": "3.11.4" 125 | } 126 | }, 127 | "nbformat": 4, 128 | "nbformat_minor": 5 129 | } 130 | -------------------------------------------------------------------------------- /Outline.txt: -------------------------------------------------------------------------------- 1 | - Hellos 2 | - What I've been asked to teach: How to do a tech interview 3 | - Lots of books out there but the industry has leaned towards "Cracking the Coding Interview" by GAYLE LAAKMANN MCDOWELL as the defacto best practice guide. 4 | 5 | - Lots of different sizes of companies and styles of interviewing 6 | - I'm going to focus on comparing the stereo typical large company and start up company interviews 7 | 8 | The flows: 9 | 10 | LARGE 11 | - Phone interview 12 | - a week or two 13 | - coding interview 14 | - a week or two 15 | - manager interview 16 | - potentially repeat for several interviewers 17 | - offer. 18 | 19 | SMALL 20 | - In person meeting 21 | - coding challenge 22 | - Personality check 23 | - offer 24 | 25 | When in doubt about the flow, kindly ask. 26 | 27 | 28 | How to get the first interview: 29 | 30 | - Build projects 31 | - Classes 32 | - Interships 33 | - Your own free time (GitHub) 34 | - Put yourself out there 35 | - Publish on the internet (Medium, etc) 36 | - Give talks or lightning talks at conferences 37 | 38 | RESUME 39 | - Get help with the Resume (simple and to the point is better than anything else in my opinion). 40 | - Put only the bigger milestones to avoid noise 41 | 42 | THE CODING INTERVIEW 43 | 44 | - Show up on time, even a bit early is best. 45 | - For me, one of the best predictors of how easy it will be to work with any person is if they show up on time to an interview. 46 | - Do some light chit chat. Not fake but interested in the interviewer. 47 | - Get the coding challenge and before you start, draw the problem. 48 | - 30% of our compute power is in our occipital lobe. Don't waist it. 49 | - Ask lots of clarifying questions. 50 | - This shows you can probe for corner cases prior to starting the work. Good engineering. 51 | - Take a wack at it. Solve it in the first way that comes to mind. Usually this is a very inefficient solution. BUT! It's a starting place. Then refine, refine, refine. 52 | - Remove particularly inefficient code: Replace linked list if a map will do the same job better. 53 | - Try your algo with a small simple problem. 54 | - Try your algo with edge cases. 55 | - Gayle uses the accronym BUD (iterate by removing Bottelnecks, Unneeded work, and Duplicated work) 56 | 57 | - Talk through the problem. Don't just do it in your head. Same thing from school when they told you don't just write down the answer. Write down each step. This shows you thought process and it is what an interviewer wants. 58 | - An incomplete answer with great lead up is much better than a complete answer with no lead up. Plus you get partial credits :) 59 | - Break The Problem Down! 60 | - Each part of the problem can be broken down into multiple smaller chuncks. 61 | - Its smaller chunks that make up each tool in our eco system. 62 | 63 | Finally write code. Leave this for last so that you don't spend your time correcting coding mistakes and focus your time on algo performance. 64 | 65 | - Big companies work with big data. They need solutions that scale. 66 | - Thus they will want to make sure you understand Big-O concepts. 67 | - Particular language is not important because they will use that lang some where. They use them all. 68 | 69 | - Smaller teams / companies will focus more on specifics of a language and framework. 70 | - You should know the language and frameworks they are using by asking before the interview or during phone screen. 71 | - Usually you don't need to be a wiz in the language but need to be able to tackle a basic Big-O problem. 72 | - Ask if you can use your language of choice if its not clear which language you need to code in. 73 | - Usually a fishy sign if the company doesn't allow you to use your language of choice. If not, they are grading you 74 | on the "wrong" things. 75 | 76 | - Talk Big-O for a while. Do complexity lecture. 77 | 78 | - End of interview. Say your thanks and follow up with POC, but not the coding interviewer. 79 | They are usually engineers with just enough time to do the interview. 80 | If you have a contact for your interviewer, a simple "Thank you" email is fine in the following days but nothinig more and do not expect a response. 81 | 82 | Practice. Go on interviews. Do interview problems at home over your favorite beverage. Don't let your first interview be the frist time you see an interview like question. This will help you stay in tune with the demands of the market. -------------------------------------------------------------------------------- /DoubleLinkedListSearch-InClass.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "alert-liquid", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "Node(5) <-> Node(10) <-> Node(1) <-> Node(7) <-> Node(8) <-> Node(2)\n", 14 | "head: Node(5)\n", 15 | "tail: Node(2)\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "class Node:\n", 21 | " def __init__(self, value, before=None, after=None):\n", 22 | " self.value = value\n", 23 | " self.before = before\n", 24 | " self.after = after\n", 25 | " \n", 26 | " def __repr__(self):\n", 27 | " return f'Node({self.value})'\n", 28 | " \n", 29 | " def __eq__(self, other):\n", 30 | " return self.value == other.value\n", 31 | "\n", 32 | " \n", 33 | "\n", 34 | "class DoubleLinkedList:\n", 35 | " def __init__(self):\n", 36 | " self.head = None\n", 37 | " self.tail = None\n", 38 | " \n", 39 | " @property\n", 40 | " def nodes(self):\n", 41 | " node_list = []\n", 42 | " current_node = self.head\n", 43 | " tail = None\n", 44 | " while current_node:\n", 45 | " node_list.append(current_node)\n", 46 | " current_node = current_node.after\n", 47 | " if current_node:\n", 48 | " tail = current_node\n", 49 | " return node_list\n", 50 | " \n", 51 | " def __repr__(self):\n", 52 | " return ' <-> '.join(repr(n) for n in self.nodes)\n", 53 | " \n", 54 | " def append(self, value):\n", 55 | " if len(self.nodes) == 0:\n", 56 | " self.head = Node(value)\n", 57 | " self.tail = self.head\n", 58 | " else:\n", 59 | " self.tail.after = Node(value, before=self.tail)\n", 60 | " self.tail = self.tail.after\n", 61 | " \n", 62 | "\n", 63 | "\n", 64 | "dll = DoubleLinkedList()\n", 65 | "dll.append(5)\n", 66 | "dll.append(10)\n", 67 | "dll.append(1)\n", 68 | "dll.append(7)\n", 69 | "dll.append(8)\n", 70 | "dll.append(2)\n", 71 | "\n", 72 | "print(dll)\n", 73 | "print('head:', dll.head)\n", 74 | "print('tail:', dll.tail)" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 2, 80 | "id": "satellite-disclosure", 81 | "metadata": {}, 82 | "outputs": [], 83 | "source": [ 84 | "def get_middle_nodes(dll_) -> list:\n", 85 | " return []" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 3, 91 | "id": "281b0dec", 92 | "metadata": {}, 93 | "outputs": [ 94 | { 95 | "data": { 96 | "text/plain": [ 97 | "[]" 98 | ] 99 | }, 100 | "execution_count": 3, 101 | "metadata": {}, 102 | "output_type": "execute_result" 103 | } 104 | ], 105 | "source": [ 106 | "get_middle_nodes(dll)" 107 | ] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "execution_count": 4, 112 | "id": "dece682d", 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "ename": "AssertionError", 117 | "evalue": "", 118 | "output_type": "error", 119 | "traceback": [ 120 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 121 | "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", 122 | "Cell \u001b[0;32mIn[4], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m get_middle_nodes(dll) \u001b[38;5;241m==\u001b[39m [Node(\u001b[38;5;241m1\u001b[39m), Node(\u001b[38;5;241m7\u001b[39m)]\n", 123 | "\u001b[0;31mAssertionError\u001b[0m: " 124 | ] 125 | } 126 | ], 127 | "source": [ 128 | "assert get_middle_nodes(dll) == [Node(1), Node(7)]" 129 | ] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "execution_count": 5, 134 | "id": "95132510", 135 | "metadata": {}, 136 | "outputs": [ 137 | { 138 | "name": "stdout", 139 | "output_type": "stream", 140 | "text": [ 141 | "Node(5) <-> Node(10) <-> Node(1) <-> Node(8) <-> Node(2)\n" 142 | ] 143 | }, 144 | { 145 | "data": { 146 | "text/plain": [ 147 | "[]" 148 | ] 149 | }, 150 | "execution_count": 5, 151 | "metadata": {}, 152 | "output_type": "execute_result" 153 | } 154 | ], 155 | "source": [ 156 | "dll = DoubleLinkedList()\n", 157 | "dll.append(5)\n", 158 | "dll.append(10)\n", 159 | "dll.append(1)\n", 160 | "dll.append(8)\n", 161 | "dll.append(2)\n", 162 | "print(dll)\n", 163 | "\n", 164 | "get_middle_nodes(dll)" 165 | ] 166 | } 167 | ], 168 | "metadata": { 169 | "kernelspec": { 170 | "display_name": "Python 3 (ipykernel)", 171 | "language": "python", 172 | "name": "python3" 173 | }, 174 | "language_info": { 175 | "codemirror_mode": { 176 | "name": "ipython", 177 | "version": 3 178 | }, 179 | "file_extension": ".py", 180 | "mimetype": "text/x-python", 181 | "name": "python", 182 | "nbconvert_exporter": "python", 183 | "pygments_lexer": "ipython3", 184 | "version": "3.11.4" 185 | } 186 | }, 187 | "nbformat": 4, 188 | "nbformat_minor": 5 189 | } 190 | -------------------------------------------------------------------------------- /BFS-InClass.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 4, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "data": { 10 | "text/plain": [ 11 | "5" 12 | ] 13 | }, 14 | "execution_count": 4, 15 | "metadata": {}, 16 | "output_type": "execute_result" 17 | } 18 | ], 19 | "source": [ 20 | "# 5\n", 21 | "# 3 10\n", 22 | "# 1 4 7 15\n", 23 | "\n", 24 | "\n", 25 | "# We want: [Node(5), 3, 10, 1, 4, 7, 15]\n", 26 | "\n", 27 | "\n", 28 | "class Node:\n", 29 | " def __init__(self, value, left=None, right=None):\n", 30 | " self.value = value\n", 31 | " self.left = left\n", 32 | " self.right = right\n", 33 | " \n", 34 | " def __repr__(self):\n", 35 | " return f'{self.value}'\n", 36 | "\n", 37 | "assert repr(Node(4)) == '4'\n", 38 | "\n", 39 | "root = Node(\n", 40 | " 5,\n", 41 | " left=Node(\n", 42 | " 3,\n", 43 | " left=Node(1), \n", 44 | " right=Node(4),\n", 45 | " ),\n", 46 | " right=Node(\n", 47 | " 10, \n", 48 | " left=Node(7), \n", 49 | " right=Node(15),\n", 50 | " )\n", 51 | ")\n", 52 | "\n", 53 | "root" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": null, 59 | "metadata": {}, 60 | "outputs": [], 61 | "source": [ 62 | "# What should the output be? Printed? Returned?\n", 63 | "# What time complexity are you looking for?\n", 64 | "# What optimizations should we employ?\n", 65 | "# What are the constraints? \n", 66 | "# How should null cases be handled? Error, or just return None?\n", 67 | "# Networkx (3rd-party library), ABC, bisect (bin search), can use? \n", 68 | "\n", 69 | "\n", 70 | "# INTERVIEWER\n", 71 | "# Can you walk me through the code that you want write?\n", 72 | "\n", 73 | "# Interviewee\n", 74 | "# " 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 27, 80 | "metadata": {}, 81 | "outputs": [], 82 | "source": [ 83 | "def nodes_by_layer(root) -> list:\n", 84 | " result = []\n", 85 | "\n", 86 | " if root is None:\n", 87 | " return []\n", 88 | "\n", 89 | " queue = [root]\n", 90 | "\n", 91 | " while queue:\n", 92 | " item = queue.pop(0)\n", 93 | " \n", 94 | " # print(item)\n", 95 | "\n", 96 | " if item.left:\n", 97 | " queue.append(item.left)\n", 98 | "\n", 99 | " if item.right:\n", 100 | " queue.append(item.right)\n", 101 | "\n", 102 | " result.append(item)\n", 103 | " \n", 104 | " return result" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 34, 110 | "metadata": {}, 111 | "outputs": [], 112 | "source": [ 113 | "ret_val = nodes_by_layer(root)\n", 114 | "assert [n.value for n in ret_val] == [5, 3, 10, 1, 4, 7, 15], ret_val\n", 115 | "\n", 116 | "assert nodes_by_layer(None) == []\n", 117 | "\n", 118 | "ret_val = nodes_by_layer(Node(75))\n", 119 | "assert [n.value for n in ret_val] == [75]" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 29, 125 | "metadata": {}, 126 | "outputs": [ 127 | { 128 | "data": { 129 | "text/plain": [ 130 | "[5, 3, 10, 1, 4, 7, 15]" 131 | ] 132 | }, 133 | "execution_count": 29, 134 | "metadata": {}, 135 | "output_type": "execute_result" 136 | } 137 | ], 138 | "source": [ 139 | "nodes_by_layer(root)" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": null, 145 | "metadata": {}, 146 | "outputs": [], 147 | "source": [] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": 10, 152 | "metadata": {}, 153 | "outputs": [ 154 | { 155 | "ename": "KeyboardInterrupt", 156 | "evalue": "", 157 | "output_type": "error", 158 | "traceback": [ 159 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 160 | "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", 161 | "Cell \u001b[0;32mIn[10], line 4\u001b[0m\n\u001b[1;32m 1\u001b[0m data \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m1\u001b[39m]\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, item \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(data):\n\u001b[0;32m----> 4\u001b[0m data\u001b[38;5;241m.\u001b[39mappend(i)\n", 162 | "\u001b[0;31mKeyboardInterrupt\u001b[0m: " 163 | ] 164 | } 165 | ], 166 | "source": [ 167 | "data = [1]\n", 168 | "\n", 169 | "for i, item in enumerate(data):\n", 170 | " data.append(i)" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": null, 176 | "metadata": {}, 177 | "outputs": [], 178 | "source": [] 179 | } 180 | ], 181 | "metadata": { 182 | "kernelspec": { 183 | "display_name": "Python 3 (ipykernel)", 184 | "language": "python", 185 | "name": "python3" 186 | }, 187 | "language_info": { 188 | "codemirror_mode": { 189 | "name": "ipython", 190 | "version": 3 191 | }, 192 | "file_extension": ".py", 193 | "mimetype": "text/x-python", 194 | "name": "python", 195 | "nbconvert_exporter": "python", 196 | "pygments_lexer": "ipython3", 197 | "version": "3.11.4" 198 | } 199 | }, 200 | "nbformat": 4, 201 | "nbformat_minor": 4 202 | } 203 | -------------------------------------------------------------------------------- /Computational-Complexity.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Computational Complexity" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "How do we use less compute resources (CPU cycles and bytes in memory) to tackle bigger and bigger problems?\n", 15 | "\n", 16 | "What's an algorithm?\n", 17 | "\n", 18 | "- Series of steps to reach a goal\n", 19 | "- Examples:\n", 20 | " - Algorithm for brushing teeth?\n", 21 | " - Algorithm for ordering a meal?\n", 22 | " \n", 23 | "Many different algorithms exist for each one of these goals. Some will take more compute resources and some will take less. \n", 24 | "\n", 25 | "When we talk about Computational Complexity we usually want to talk about worst case scenarios. We want to know how will this algorithm perform in the worst case. We refer to this measure of computational requirements with a special notation known as Big-O or\n", 26 | "\n", 27 | " O()\n", 28 | " \n", 29 | "How much time will it take me to brush 2 billion teeth?\n", 30 | " \n", 31 | "In industry we are usually less interested in best case scenarios but when we are we refer to that with Big-Omega notation or\n", 32 | "\n", 33 | " Ω()\n", 34 | " \n", 35 | "Big-Ɵ (Big-Theta) is the notation used to describe the runtime of an algorithm if Big-O == Big-Ω. And that's the last time you'll ever hear about Big-Ɵ in your life. (It's extremely infrequently used).\n", 36 | "\n", 37 | "This Big-Something notation is purposefully vague and general. This way we can use it to describe the runtime requirements of all sorts of different problems." 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": {}, 43 | "source": [ 44 | "To calculate the Big-O or Big-Ω for an algorithm, we need to dive a bit deeper. \n", 45 | "\n", 46 | "For Big-O, we need to think about what would cause an algorithm to take the most steps it possibly could. Are there some if conditional that lead to many more instructions? \n", 47 | "\n", 48 | "Big-Ω, we need to think about what would cause an algorithm to take the fewest steps it possibly could. Could a set of data in a particular order signal to the algorithm that no work is required?\n", 49 | "\n", 50 | "\n", 51 | "\n", 52 | "###### Examples\n", 53 | "\n", 54 | "What is the Big-O and Big-Ω for the following function:\n", 55 | "\n", 56 | "```python\n", 57 | "def return_true(data: list) -> bool:\n", 58 | " return True\n", 59 | "```\n", 60 | "\n", 61 | "Answer\n", 62 | "
\n", 63 | "- O(just return true) or O(1)\n", 64 | "
\n", 65 | "- Ω(just return true) or Ω(1)\n", 66 | "
\n", 67 | "\n", 68 | "```python\n", 69 | "def return_true_if_x_in_list(x: int, list_: list) -> bool:\n", 70 | " for item in list_:\n", 71 | " if x == item:\n", 72 | " return True\n", 73 | " return False\n", 74 | "```\n", 75 | "\n", 76 | "Answer\n", 77 | "
\n", 78 | "- O(number of items to check) or O(N)\n", 79 | "
\n", 80 | "- Ω(check first item and we find x) or Ω(1)\n", 81 | "
" 82 | ] 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "metadata": {}, 87 | "source": [ 88 | "So what if our Big-O function is...\n", 89 | "\n", 90 | " Big-O(N^2 + 2*N + 45)\n", 91 | " \n", 92 | "Well, we are only concerned with most drastic changes to the computation complexity as the data set grows, so we only need to care about the highest order term. \n", 93 | "\n", 94 | "For example, let's say we have the following three algorithms:\n", 95 | "\n", 96 | "- Big-O(N^2 + 2*N + 45)\n", 97 | "- Big-O(2N^2 + 2*N)\n", 98 | "- Big-O(N^2)\n", 99 | "\n", 100 | "How do these perform as the data grows?" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 1, 106 | "metadata": {}, 107 | "outputs": [ 108 | { 109 | "data": { 110 | "text/html": [ 111 | "
\n", 112 | "\n", 125 | "\n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | "
1101001000
n**2 + 2*n + 4548165102451002045
n**2 + 2*n3120102001002000
n**21100100001000000
\n", 159 | "
" 160 | ], 161 | "text/plain": [ 162 | " 1 10 100 1000\n", 163 | "n**2 + 2*n + 45 48 165 10245 1002045\n", 164 | "n**2 + 2*n 3 120 10200 1002000\n", 165 | "n**2 1 100 10000 1000000" 166 | ] 167 | }, 168 | "execution_count": 1, 169 | "metadata": {}, 170 | "output_type": "execute_result" 171 | } 172 | ], 173 | "source": [ 174 | "functions = {\n", 175 | " 'n**2 + 2*n + 45': lambda n: n**2 + 2*n + 45,\n", 176 | " 'n**2 + 2*n': lambda n: n**2 + 2*n,\n", 177 | " 'n**2': lambda n: n**2,\n", 178 | "}\n", 179 | "\n", 180 | "data_sizes = [1, 10, 100, 1000]\n", 181 | "\n", 182 | "results = {}\n", 183 | "for data_size in data_sizes:\n", 184 | " results[data_size] = {} \n", 185 | " for function_str, function in functions.items():\n", 186 | " results[data_size][function_str] = function(data_size)\n", 187 | "\n", 188 | "# You don't need to know how to use Pandas yet. \n", 189 | "# This is just to make the table of data look pretty.\n", 190 | "import pandas as pd \n", 191 | "pd.DataFrame(results)" 192 | ] 193 | }, 194 | { 195 | "cell_type": "markdown", 196 | "metadata": {}, 197 | "source": [ 198 | "As the data grows, only the highest order term matters. Thus the runtime complexity for each of the functions above is `O(N^2)`." 199 | ] 200 | }, 201 | { 202 | "cell_type": "markdown", 203 | "metadata": {}, 204 | "source": [ 205 | "- O(1) - Constant time\n", 206 | "- O(log(n)) - logarithmic time\n", 207 | "- O(n) - linear time\n", 208 | "- O(n * log(n)) - linearithmic time\n", 209 | "- O(n^2) - quadratic time\n", 210 | "- O(n^c) - polynomial time\n", 211 | "- O(c^n) - exponential time\n", 212 | "- O(n!) - factorial time\n", 213 | "- O(∞) - infinite time" 214 | ] 215 | }, 216 | { 217 | "cell_type": "code", 218 | "execution_count": 2, 219 | "metadata": {}, 220 | "outputs": [ 221 | { 222 | "data": { 223 | "text/html": [ 224 | "
\n", 225 | " \n", 226 | " Loading BokehJS ...\n", 227 | "
\n" 228 | ] 229 | }, 230 | "metadata": {}, 231 | "output_type": "display_data" 232 | }, 233 | { 234 | "data": { 235 | "application/javascript": [ 236 | "(function(root) {\n", 237 | " function now() {\n", 238 | " return new Date();\n", 239 | " }\n", 240 | "\n", 241 | " const force = true;\n", 242 | "\n", 243 | " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", 244 | " root._bokeh_onload_callbacks = [];\n", 245 | " root._bokeh_is_loading = undefined;\n", 246 | " }\n", 247 | "\n", 248 | "const JS_MIME_TYPE = 'application/javascript';\n", 249 | " const HTML_MIME_TYPE = 'text/html';\n", 250 | " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", 251 | " const CLASS_NAME = 'output_bokeh rendered_html';\n", 252 | "\n", 253 | " /**\n", 254 | " * Render data to the DOM node\n", 255 | " */\n", 256 | " function render(props, node) {\n", 257 | " const script = document.createElement(\"script\");\n", 258 | " node.appendChild(script);\n", 259 | " }\n", 260 | "\n", 261 | " /**\n", 262 | " * Handle when an output is cleared or removed\n", 263 | " */\n", 264 | " function handleClearOutput(event, handle) {\n", 265 | " const cell = handle.cell;\n", 266 | "\n", 267 | " const id = cell.output_area._bokeh_element_id;\n", 268 | " const server_id = cell.output_area._bokeh_server_id;\n", 269 | " // Clean up Bokeh references\n", 270 | " if (id != null && id in Bokeh.index) {\n", 271 | " Bokeh.index[id].model.document.clear();\n", 272 | " delete Bokeh.index[id];\n", 273 | " }\n", 274 | "\n", 275 | " if (server_id !== undefined) {\n", 276 | " // Clean up Bokeh references\n", 277 | " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", 278 | " cell.notebook.kernel.execute(cmd_clean, {\n", 279 | " iopub: {\n", 280 | " output: function(msg) {\n", 281 | " const id = msg.content.text.trim();\n", 282 | " if (id in Bokeh.index) {\n", 283 | " Bokeh.index[id].model.document.clear();\n", 284 | " delete Bokeh.index[id];\n", 285 | " }\n", 286 | " }\n", 287 | " }\n", 288 | " });\n", 289 | " // Destroy server and session\n", 290 | " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", 291 | " cell.notebook.kernel.execute(cmd_destroy);\n", 292 | " }\n", 293 | " }\n", 294 | "\n", 295 | " /**\n", 296 | " * Handle when a new output is added\n", 297 | " */\n", 298 | " function handleAddOutput(event, handle) {\n", 299 | " const output_area = handle.output_area;\n", 300 | " const output = handle.output;\n", 301 | "\n", 302 | " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", 303 | " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", 304 | " return\n", 305 | " }\n", 306 | "\n", 307 | " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", 308 | "\n", 309 | " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", 310 | " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", 311 | " // store reference to embed id on output_area\n", 312 | " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", 313 | " }\n", 314 | " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", 315 | " const bk_div = document.createElement(\"div\");\n", 316 | " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", 317 | " const script_attrs = bk_div.children[0].attributes;\n", 318 | " for (let i = 0; i < script_attrs.length; i++) {\n", 319 | " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", 320 | " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", 321 | " }\n", 322 | " // store reference to server id on output_area\n", 323 | " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", 324 | " }\n", 325 | " }\n", 326 | "\n", 327 | " function register_renderer(events, OutputArea) {\n", 328 | "\n", 329 | " function append_mime(data, metadata, element) {\n", 330 | " // create a DOM node to render to\n", 331 | " const toinsert = this.create_output_subarea(\n", 332 | " metadata,\n", 333 | " CLASS_NAME,\n", 334 | " EXEC_MIME_TYPE\n", 335 | " );\n", 336 | " this.keyboard_manager.register_events(toinsert);\n", 337 | " // Render to node\n", 338 | " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", 339 | " render(props, toinsert[toinsert.length - 1]);\n", 340 | " element.append(toinsert);\n", 341 | " return toinsert\n", 342 | " }\n", 343 | "\n", 344 | " /* Handle when an output is cleared or removed */\n", 345 | " events.on('clear_output.CodeCell', handleClearOutput);\n", 346 | " events.on('delete.Cell', handleClearOutput);\n", 347 | "\n", 348 | " /* Handle when a new output is added */\n", 349 | " events.on('output_added.OutputArea', handleAddOutput);\n", 350 | "\n", 351 | " /**\n", 352 | " * Register the mime type and append_mime function with output_area\n", 353 | " */\n", 354 | " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", 355 | " /* Is output safe? */\n", 356 | " safe: true,\n", 357 | " /* Index of renderer in `output_area.display_order` */\n", 358 | " index: 0\n", 359 | " });\n", 360 | " }\n", 361 | "\n", 362 | " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", 363 | " if (root.Jupyter !== undefined) {\n", 364 | " const events = require('base/js/events');\n", 365 | " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", 366 | "\n", 367 | " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", 368 | " register_renderer(events, OutputArea);\n", 369 | " }\n", 370 | " }\n", 371 | " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", 372 | " root._bokeh_timeout = Date.now() + 5000;\n", 373 | " root._bokeh_failed_load = false;\n", 374 | " }\n", 375 | "\n", 376 | " const NB_LOAD_WARNING = {'data': {'text/html':\n", 377 | " \"
\\n\"+\n", 378 | " \"

\\n\"+\n", 379 | " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", 380 | " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", 381 | " \"

\\n\"+\n", 382 | " \"
    \\n\"+\n", 383 | " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", 384 | " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", 385 | " \"
\\n\"+\n", 386 | " \"\\n\"+\n", 387 | " \"from bokeh.resources import INLINE\\n\"+\n", 388 | " \"output_notebook(resources=INLINE)\\n\"+\n", 389 | " \"\\n\"+\n", 390 | " \"
\"}};\n", 391 | "\n", 392 | " function display_loaded() {\n", 393 | " const el = document.getElementById(\"1002\");\n", 394 | " if (el != null) {\n", 395 | " el.textContent = \"BokehJS is loading...\";\n", 396 | " }\n", 397 | " if (root.Bokeh !== undefined) {\n", 398 | " if (el != null) {\n", 399 | " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", 400 | " }\n", 401 | " } else if (Date.now() < root._bokeh_timeout) {\n", 402 | " setTimeout(display_loaded, 100)\n", 403 | " }\n", 404 | " }\n", 405 | "\n", 406 | " function run_callbacks() {\n", 407 | " try {\n", 408 | " root._bokeh_onload_callbacks.forEach(function(callback) {\n", 409 | " if (callback != null)\n", 410 | " callback();\n", 411 | " });\n", 412 | " } finally {\n", 413 | " delete root._bokeh_onload_callbacks\n", 414 | " }\n", 415 | " console.debug(\"Bokeh: all callbacks have finished\");\n", 416 | " }\n", 417 | "\n", 418 | " function load_libs(css_urls, js_urls, callback) {\n", 419 | " if (css_urls == null) css_urls = [];\n", 420 | " if (js_urls == null) js_urls = [];\n", 421 | "\n", 422 | " root._bokeh_onload_callbacks.push(callback);\n", 423 | " if (root._bokeh_is_loading > 0) {\n", 424 | " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", 425 | " return null;\n", 426 | " }\n", 427 | " if (js_urls == null || js_urls.length === 0) {\n", 428 | " run_callbacks();\n", 429 | " return null;\n", 430 | " }\n", 431 | " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", 432 | " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", 433 | "\n", 434 | " function on_load() {\n", 435 | " root._bokeh_is_loading--;\n", 436 | " if (root._bokeh_is_loading === 0) {\n", 437 | " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", 438 | " run_callbacks()\n", 439 | " }\n", 440 | " }\n", 441 | "\n", 442 | " function on_error(url) {\n", 443 | " console.error(\"failed to load \" + url);\n", 444 | " }\n", 445 | "\n", 446 | " for (let i = 0; i < css_urls.length; i++) {\n", 447 | " const url = css_urls[i];\n", 448 | " const element = document.createElement(\"link\");\n", 449 | " element.onload = on_load;\n", 450 | " element.onerror = on_error.bind(null, url);\n", 451 | " element.rel = \"stylesheet\";\n", 452 | " element.type = \"text/css\";\n", 453 | " element.href = url;\n", 454 | " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", 455 | " document.body.appendChild(element);\n", 456 | " }\n", 457 | "\n", 458 | " for (let i = 0; i < js_urls.length; i++) {\n", 459 | " const url = js_urls[i];\n", 460 | " const element = document.createElement('script');\n", 461 | " element.onload = on_load;\n", 462 | " element.onerror = on_error.bind(null, url);\n", 463 | " element.async = false;\n", 464 | " element.src = url;\n", 465 | " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", 466 | " document.head.appendChild(element);\n", 467 | " }\n", 468 | " };\n", 469 | "\n", 470 | " function inject_raw_css(css) {\n", 471 | " const element = document.createElement(\"style\");\n", 472 | " element.appendChild(document.createTextNode(css));\n", 473 | " document.body.appendChild(element);\n", 474 | " }\n", 475 | "\n", 476 | " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js\"];\n", 477 | " const css_urls = [];\n", 478 | "\n", 479 | " const inline_js = [ function(Bokeh) {\n", 480 | " Bokeh.set_log_level(\"info\");\n", 481 | " },\n", 482 | "function(Bokeh) {\n", 483 | " }\n", 484 | " ];\n", 485 | "\n", 486 | " function run_inline_js() {\n", 487 | " if (root.Bokeh !== undefined || force === true) {\n", 488 | " for (let i = 0; i < inline_js.length; i++) {\n", 489 | " inline_js[i].call(root, root.Bokeh);\n", 490 | " }\n", 491 | "if (force === true) {\n", 492 | " display_loaded();\n", 493 | " }} else if (Date.now() < root._bokeh_timeout) {\n", 494 | " setTimeout(run_inline_js, 100);\n", 495 | " } else if (!root._bokeh_failed_load) {\n", 496 | " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", 497 | " root._bokeh_failed_load = true;\n", 498 | " } else if (force !== true) {\n", 499 | " const cell = $(document.getElementById(\"1002\")).parents('.cell').data().cell;\n", 500 | " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", 501 | " }\n", 502 | " }\n", 503 | "\n", 504 | " if (root._bokeh_is_loading === 0) {\n", 505 | " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", 506 | " run_inline_js();\n", 507 | " } else {\n", 508 | " load_libs(css_urls, js_urls, function() {\n", 509 | " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", 510 | " run_inline_js();\n", 511 | " });\n", 512 | " }\n", 513 | "}(window));" 514 | ], 515 | "application/vnd.bokehjs_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"1002\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"1002\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" 516 | }, 517 | "metadata": {}, 518 | "output_type": "display_data" 519 | }, 520 | { 521 | "data": { 522 | "text/html": [ 523 | "\n", 524 | "
\n" 525 | ] 526 | }, 527 | "metadata": {}, 528 | "output_type": "display_data" 529 | }, 530 | { 531 | "data": { 532 | "application/javascript": [ 533 | "(function(root) {\n", 534 | " function embed_document(root) {\n", 535 | " const docs_json = {\"a1bf5b56-4b0e-4928-874d-1cbe45bd618b\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1012\"}],\"center\":[{\"id\":\"1015\"},{\"id\":\"1019\"},{\"id\":\"1051\"}],\"height\":400,\"left\":[{\"id\":\"1016\"}],\"renderers\":[{\"id\":\"1038\"},{\"id\":\"1057\"},{\"id\":\"1077\"},{\"id\":\"1099\"}],\"title\":{\"id\":\"1040\"},\"toolbar\":{\"id\":\"1027\"},\"width\":900,\"x_range\":{\"id\":\"1004\"},\"x_scale\":{\"id\":\"1008\"},\"y_range\":{\"id\":\"1006\"},\"y_scale\":{\"id\":\"1010\"}},\"id\":\"1003\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1054\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1073\"},\"glyph\":{\"id\":\"1074\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1076\"},\"nonselection_glyph\":{\"id\":\"1075\"},\"view\":{\"id\":\"1078\"}},\"id\":\"1077\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[1000]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[1000]}},\"selected\":{\"id\":\"1070\"},\"selection_policy\":{\"id\":\"1069\"}},\"id\":\"1053\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1092\",\"type\":\"Selection\"},{\"attributes\":{\"source\":{\"id\":\"1053\"}},\"id\":\"1058\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1006\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1025\",\"type\":\"HelpTool\"},{\"attributes\":{\"label\":{\"value\":\"O(log(n))\"},\"renderers\":[{\"id\":\"1057\"}]},\"id\":\"1072\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1056\",\"type\":\"Line\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[1000]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[1000]}},\"selected\":{\"id\":\"1116\"},\"selection_policy\":{\"id\":\"1115\"}},\"id\":\"1095\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"1034\"}},\"id\":\"1039\",\"type\":\"CDSView\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#ff7f0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1055\",\"type\":\"Line\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[1000]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[1000]}},\"selected\":{\"id\":\"1092\"},\"selection_policy\":{\"id\":\"1091\"}},\"id\":\"1073\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[1000]}},\"selected\":{\"id\":\"1049\"},\"selection_policy\":{\"id\":\"1048\"}},\"id\":\"1034\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"1073\"}},\"id\":\"1078\",\"type\":\"CDSView\"},{\"attributes\":{\"line_color\":\"#2ca02c\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1074\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"items\":[{\"id\":\"1052\"},{\"id\":\"1072\"},{\"id\":\"1094\"},{\"id\":\"1118\"}],\"location\":\"top_left\"},\"id\":\"1051\",\"type\":\"Legend\"},{\"attributes\":{\"source\":{\"id\":\"1095\"}},\"id\":\"1100\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1046\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#2ca02c\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1076\",\"type\":\"Line\"},{\"attributes\":{\"label\":{\"value\":\"O(n)\"},\"renderers\":[{\"id\":\"1077\"}]},\"id\":\"1094\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#2ca02c\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1075\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1095\"},\"glyph\":{\"id\":\"1096\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1098\"},\"nonselection_glyph\":{\"id\":\"1097\"},\"view\":{\"id\":\"1100\"}},\"id\":\"1099\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"axis\":{\"id\":\"1016\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1019\",\"type\":\"Grid\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1043\"},\"group\":null,\"major_label_policy\":{\"id\":\"1044\"},\"ticker\":{\"id\":\"1017\"}},\"id\":\"1016\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1017\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1047\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1034\"},\"glyph\":{\"id\":\"1035\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1037\"},\"nonselection_glyph\":{\"id\":\"1036\"},\"view\":{\"id\":\"1039\"}},\"id\":\"1038\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"value\":1}},\"id\":\"1036\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1069\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1091\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"value\":1}},\"id\":\"1037\",\"type\":\"Line\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#d62728\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1098\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#d62728\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1097\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1020\",\"type\":\"PanTool\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1040\",\"type\":\"Title\"},{\"attributes\":{\"overlay\":{\"id\":\"1026\"}},\"id\":\"1022\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1013\",\"type\":\"BasicTicker\"},{\"attributes\":{\"label\":{\"value\":\"O(1)\"},\"renderers\":[{\"id\":\"1038\"}]},\"id\":\"1052\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1023\",\"type\":\"SaveTool\"},{\"attributes\":{\"label\":{\"value\":\"O(n * log(n))\"},\"renderers\":[{\"id\":\"1099\"}]},\"id\":\"1118\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1070\",\"type\":\"Selection\"},{\"attributes\":{\"axis\":{\"id\":\"1012\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1015\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"ResetTool\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1026\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1115\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"tools\":[{\"id\":\"1020\"},{\"id\":\"1021\"},{\"id\":\"1022\"},{\"id\":\"1023\"},{\"id\":\"1024\"},{\"id\":\"1025\"}]},\"id\":\"1027\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1116\",\"type\":\"Selection\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1046\"},\"group\":null,\"major_label_policy\":{\"id\":\"1047\"},\"ticker\":{\"id\":\"1013\"}},\"id\":\"1012\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1010\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1049\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1008\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1044\",\"type\":\"AllLabels\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"value\":1}},\"id\":\"1035\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"#d62728\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1096\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1004\",\"type\":\"DataRange1d\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1053\"},\"glyph\":{\"id\":\"1054\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1056\"},\"nonselection_glyph\":{\"id\":\"1055\"},\"view\":{\"id\":\"1058\"}},\"id\":\"1057\",\"type\":\"GlyphRenderer\"}],\"root_ids\":[\"1003\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n", 536 | " const render_items = [{\"docid\":\"a1bf5b56-4b0e-4928-874d-1cbe45bd618b\",\"root_ids\":[\"1003\"],\"roots\":{\"1003\":\"a6e5e77d-ee05-4f52-9f6b-dbe68211e238\"}}];\n", 537 | " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", 538 | " }\n", 539 | " if (root.Bokeh !== undefined) {\n", 540 | " embed_document(root);\n", 541 | " } else {\n", 542 | " let attempts = 0;\n", 543 | " const timer = setInterval(function(root) {\n", 544 | " if (root.Bokeh !== undefined) {\n", 545 | " clearInterval(timer);\n", 546 | " embed_document(root);\n", 547 | " } else {\n", 548 | " attempts++;\n", 549 | " if (attempts > 100) {\n", 550 | " clearInterval(timer);\n", 551 | " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", 552 | " }\n", 553 | " }\n", 554 | " }, 10, root)\n", 555 | " }\n", 556 | "})(window);" 557 | ], 558 | "application/vnd.bokehjs_exec.v0+json": "" 559 | }, 560 | "metadata": { 561 | "application/vnd.bokehjs_exec.v0+json": { 562 | "id": "1003" 563 | } 564 | }, 565 | "output_type": "display_data" 566 | } 567 | ], 568 | "source": [ 569 | "import math\n", 570 | "import numpy as np\n", 571 | "\n", 572 | "functions = {\n", 573 | " 'O(1)': lambda n: 1,\n", 574 | " 'O(log(n))': lambda n: np.log2(n),\n", 575 | " 'O(n)': lambda n: n,\n", 576 | " 'O(n * log(n))': lambda n: n * np.log2(n),\n", 577 | "# 'O(n^2)': lambda n: n ** 2,\n", 578 | "# 'O(c^n)': lambda n: 2 ** n,\n", 579 | "# 'O(n!)': lambda n: [np.math.factorial(int(x)) for x in n],\n", 580 | "}\n", 581 | "\n", 582 | "from bokeh.plotting import figure, output_notebook, show\n", 583 | "from bokeh import palettes\n", 584 | "output_notebook()\n", 585 | "\n", 586 | "x_points = np.linspace(0.1, 10, 1000)\n", 587 | "fig = figure(plot_width=900, plot_height=400)\n", 588 | "for i, (function_str, function) in enumerate(functions.items()):\n", 589 | " y_points = function(x_points)\n", 590 | " fig.line(\n", 591 | " x=x_points, \n", 592 | " y=y_points, \n", 593 | " color=palettes.Category10[10][i], \n", 594 | " legend_label=function_str,\n", 595 | " line_width=2,\n", 596 | " )\n", 597 | "\n", 598 | "fig.legend.location = \"top_left\"\n", 599 | "show(fig)" 600 | ] 601 | }, 602 | { 603 | "cell_type": "markdown", 604 | "metadata": {}, 605 | "source": [ 606 | "Helpful Big-O links:\n", 607 | "- https://towardsdatascience.com/the-big-o-notation-d35d52f38134\n", 608 | "- https://towardsdatascience.com/a-data-scientists-guide-to-data-structures-algorithms-1176395015a0\n", 609 | "- https://stackoverflow.com/questions/2307283/what-does-olog-n-mean-exactly\n", 610 | "- https://stackoverflow.com/questions/13467674/determining-complexity-for-recursive-functions-big-o-notation" 611 | ] 612 | } 613 | ], 614 | "metadata": { 615 | "kernelspec": { 616 | "display_name": "Python 3 (ipykernel)", 617 | "language": "python", 618 | "name": "python3" 619 | }, 620 | "language_info": { 621 | "codemirror_mode": { 622 | "name": "ipython", 623 | "version": 3 624 | }, 625 | "file_extension": ".py", 626 | "mimetype": "text/x-python", 627 | "name": "python", 628 | "nbconvert_exporter": "python", 629 | "pygments_lexer": "ipython3", 630 | "version": "3.9.13" 631 | } 632 | }, 633 | "nbformat": 4, 634 | "nbformat_minor": 2 635 | } 636 | --------------------------------------------------------------------------------