From 53027c3c57e2369004c80af0a009bef91a5d3ce6 Mon Sep 17 00:00:00 2001 From: Zobeir-Rigi Date: Mon, 6 Jul 2026 00:54:12 +0100 Subject: [PATCH 1/2] Implement skip list --- Sprint-2/implement_skip_list/skip_list.py | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Sprint-2/implement_skip_list/skip_list.py diff --git a/Sprint-2/implement_skip_list/skip_list.py b/Sprint-2/implement_skip_list/skip_list.py new file mode 100644 index 0000000..439c2fb --- /dev/null +++ b/Sprint-2/implement_skip_list/skip_list.py @@ -0,0 +1,37 @@ +class SkipList: + def __init__(self): + self.items = [] + + def insert(self, value): + left = 0 + right = len(self.items) + + while left < right: + mid = (left + right) // 2 + + if self.items[mid] < value: + left = mid + 1 + else: + right = mid + + self.items.insert(left, value) + + def __contains__(self, value): + left = 0 + right = len(self.items) - 1 + + while left <= right: + mid = (left + right) // 2 + + if self.items[mid] == value: + return True + + if self.items[mid] < value: + left = mid + 1 + else: + right = mid - 1 + + return False + + def to_list(self): + return list(self.items) \ No newline at end of file From 44dde927137b61d0ed9a6f00570e2a3ca7e060cd Mon Sep 17 00:00:00 2001 From: Zobeir-Rigi Date: Tue, 14 Jul 2026 17:13:21 +0100 Subject: [PATCH 2/2] Implement skip list using node levels --- Sprint-2/implement_skip_list/skip_list.py | 83 ++++++++++++++++------- 1 file changed, 60 insertions(+), 23 deletions(-) diff --git a/Sprint-2/implement_skip_list/skip_list.py b/Sprint-2/implement_skip_list/skip_list.py index 439c2fb..cd007ac 100644 --- a/Sprint-2/implement_skip_list/skip_list.py +++ b/Sprint-2/implement_skip_list/skip_list.py @@ -1,37 +1,74 @@ +import random + +MAX_LEVEL = 4 + + +class Node: + def __init__(self, value, level): + self.value = value + self.forward = [None] * level + + class SkipList: def __init__(self): - self.items = [] + self.head = Node(None, MAX_LEVEL) + self.level = 1 + + def _random_level(self): + level = 1 + + while level < MAX_LEVEL and random.random() < 0.5: + level += 1 + + return level def insert(self, value): - left = 0 - right = len(self.items) + update = [None] * MAX_LEVEL + current = self.head - while left < right: - mid = (left + right) // 2 + for i in range(self.level - 1, -1, -1): + while ( + current.forward[i] is not None + and current.forward[i].value < value + ): + current = current.forward[i] - if self.items[mid] < value: - left = mid + 1 - else: - right = mid + update[i] = current - self.items.insert(left, value) + node_level = self._random_level() - def __contains__(self, value): - left = 0 - right = len(self.items) - 1 + if node_level > self.level: + for i in range(self.level, node_level): + update[i] = self.head + + self.level = node_level - while left <= right: - mid = (left + right) // 2 + new_node = Node(value, node_level) - if self.items[mid] == value: - return True + for i in range(node_level): + new_node.forward[i] = update[i].forward[i] + update[i].forward[i] = new_node + + def __contains__(self, value): + current = self.head - if self.items[mid] < value: - left = mid + 1 - else: - right = mid - 1 + for i in range(self.level - 1, -1, -1): + while ( + current.forward[i] is not None + and current.forward[i].value < value + ): + current = current.forward[i] - return False + current = current.forward[0] + + return current is not None and current.value == value def to_list(self): - return list(self.items) \ No newline at end of file + result = [] + current = self.head.forward[0] + + while current is not None: + result.append(current.value) + current = current.forward[0] + + return result \ No newline at end of file