Queer European MD passionate about IT
Browse Source

Updated solution to 530:

yunoac 4 years ago
parent
commit
b406308d11
1 changed files with 27 additions and 24 deletions
  1. 27 24
      Mission530Solutions.ipynb

+ 27 - 24
Mission530Solutions.ipynb

@@ -17,7 +17,19 @@
    "cell_type": "code",
    "execution_count": 1,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "ename": "ModuleNotFoundError",
+     "evalue": "No module named 'btree'",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
+      "\u001b[0;32m<ipython-input-1-9c226edf958a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mbtree\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mBTree\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'btree'"
+     ]
+    }
+   ],
    "source": [
     "from btree import BTree"
    ]
@@ -30,8 +42,8 @@
    "source": [
     "class KVStore(BTree):\n",
     "    \n",
-    "    def __init__(self):\n",
-    "        super().__init__(2)"
+    "    def __init__(self, split_threshold=2):\n",
+    "        super().__init__(split_threshold)"
    ]
   },
   {
@@ -44,9 +56,7 @@
     "\n",
     "We override the `add()` method because we want a different behavior in the `KVStore` than the one inherited from the `BTree`. Namely, we want to have no duplicates.\n",
     "\n",
-    "To implement the new `add()` method we will need to use the `BTree.__find_node()` and `BTree.add()` methods.\n",
-    "\n",
-    "To call the `__find_node()` method we need to use a special syntax because it is private. This syntax is `self._BTree__find_node()`."
+    "To implement the new `add()` method we will need to use the `BTree._find_node()` and `BTree.add()` methods."
    ]
   },
   {
@@ -61,9 +71,7 @@
     "        super().__init__(split_threshold)\n",
     "        \n",
     "    def add(self, key, value):\n",
-    "        # The find_node method is private\n",
-    "        # We need to call it using _BTree__find_node\n",
-    "        node = self._BTree__find_node(self.root, key)\n",
+    "        node = self._find_node(self.root, key)\n",
     "        if node is None:\n",
     "            super().add(key, value)\n",
     "        else:\n",
@@ -138,9 +146,7 @@
     "        super().__init__(split_threshold)\n",
     "        \n",
     "    def add(self, key, value):\n",
-    "        # The find_node method is private\n",
-    "        # We need to call it using _BTree__find_node\n",
-    "        node = self._BTree__find_node(self.root, key)\n",
+    "        node = self._find_node(self.root, key)\n",
     "        if node is None:\n",
     "            super().add(key, value)\n",
     "        else:\n",
@@ -214,9 +220,7 @@
     "        super().__init__(split_threshold)\n",
     "        \n",
     "    def add(self, key, value):\n",
-    "        # The find_node method is private\n",
-    "        # We need to call it using _BTree__find_node\n",
-    "        node = self._BTree__find_node(self.root, key)\n",
+    "        node = self._find_node(self.root, key)\n",
     "        if node is None:\n",
     "            super().add(key, value)\n",
     "        else:\n",
@@ -264,7 +268,7 @@
    "source": [
     "# Range Queries\n",
     "\n",
-    "Our solution consisted in replacing both `float('-inf')` and `float('inf')` by `None`. Then we created a private method named `__range_intersects` that checks whether the query range intersects with the node range.\n",
+    "Our solution consisted in replacing both `float('-inf')` and `float('inf')` by `None`. Then we created a method named `_range_intersects` that checks whether the query range intersects with the node range.\n",
     "\n",
     "We make the condition work in a way such that if `min_key` is `None` then it is always considered smaller than any other key and if `max_key` is `None` then it is always considered larger than any other key."
    ]
@@ -281,9 +285,7 @@
     "        super().__init__(split_threshold)\n",
     "        \n",
     "    def add(self, key, value):\n",
-    "        # The find_node method is private\n",
-    "        # We need to call it using _BTree__find_node\n",
-    "        node = self._BTree__find_node(self.root, key)\n",
+    "        node = self._find_node(self.root, key)\n",
     "        if node is None:\n",
     "            super().add(key, value)\n",
     "        else:\n",
@@ -298,8 +300,8 @@
     "    def __getitem__(self, key):\n",
     "        return self.get_value(key)\n",
     "    \n",
-    "    def __range_query(self, range_start, range_end, current_node, min_key, max_key):\n",
-    "        if not self.__range_intersects(range_start, range_end, min_key, max_key):\n",
+    "    def _range_query(self, range_start, range_end, current_node, min_key, max_key):\n",
+    "        if not self._range_intersects(range_start, range_end, min_key, max_key):\n",
     "            return []\n",
     "        results = []\n",
     "        for i, key in enumerate(current_node.keys):\n",
@@ -309,13 +311,13 @@
     "            for i, child in enumerate(current_node.children):\n",
     "                new_min_key = current_node.keys[i - 1] if i > 0 else min_key\n",
     "                new_max_key = current_node.keys[i] if i < len(current_node) else max_key\n",
-    "                results += self.__range_query(range_start, range_end, child, new_min_key, new_max_key)\n",
+    "                results += self._range_query(range_start, range_end, child, new_min_key, new_max_key)\n",
     "        return results \n",
     "\n",
     "    def range_query(self, range_start, range_end):\n",
-    "        return self.__range_query(range_start, range_end, self.root, float('-inf'), float('inf'))\n",
+    "        return self._range_query(range_start, range_end, self.root, float('-inf'), float('inf'))\n",
     "    \n",
-    "    def __range_intersects(self, range_start, range_end, node_min, node_max):\n",
+    "    def _range_intersects(self, range_start, range_end, node_min, node_max):\n",
     "        if not node_min is None and node_min > range_end:\n",
     "            return False\n",
     "        if not node_max is None and node_max < range_start:\n",
@@ -501,6 +503,7 @@
     }
    ],
    "source": [
+    "import time\n",
     "import csv\n",
     "\n",
     "dict_kv = DictKVStore()\n",