|
@@ -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",
|