From 22634735187479e7273c8639f5df997e856f4eec Mon Sep 17 00:00:00 2001 From: pratiamalden Date: Fri, 12 Dec 2025 20:40:19 +0000 Subject: [PATCH 1/2] implement skip list --- Sprint-2/implement_skip_list/skip_list.py | 71 +++++++++++++++++++++++ 1 file changed, 71 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..710faad --- /dev/null +++ b/Sprint-2/implement_skip_list/skip_list.py @@ -0,0 +1,71 @@ +import random + + +class Node: + def __init__(self, value, level): + self.value = value + self.next = [None] * (level + 1) # next[i] the next node at level i + + +class SkipList: + MAX_LEVEL = 16 + P = 0.5 + + def __init__(self): + self.head = Node(None, self.MAX_LEVEL) + self.level = 0 # highest level currently in use + + def _random_level(self): + lvl = 0 + while random.random() < self.P and lvl < self.MAX_LEVEL: + lvl += 1 + return lvl + + def insert(self, value): + update = [None] * (self.MAX_LEVEL + 1) + x = self.head + + # Find the place where the new value should go + for i in range(self.level, -1, -1): + while x.next[i] and x.next[i].value < value: + x = x.next[i] + update[i] = x + + x0 = x.next[0] + if x0 and x0.value == value: + return + + node_level = self._random_level() + + if node_level > self.level: + for i in range(self.level + 1, node_level + 1): + update[i] = self.head + self.level = node_level + + new_node = Node(value, node_level) + for i in range(node_level + 1): + new_node.next[i] = update[i].next[i] + update[i].next[i] = new_node + + # Check if value exists + def contains(self, value): + x = self.head + for lvl in range(self.level, -1, -1): + while x.next[lvl] and x.next[lvl].value < value: + x = x.next[lvl] + + x = x.next[0] + return x is not None and x.value == value + + def __contains__(self, value): + return self.contains(value) + + def to_list(self): + result = [] + x = self.head.next[0] + while x: + result.append(x.value) + x = x.next[0] + return result + + From 20b19e822200021d06ab60804549918fb2a2b746 Mon Sep 17 00:00:00 2001 From: pratiamalden Date: Fri, 20 Mar 2026 12:45:19 +0000 Subject: [PATCH 2/2] Rename variables --- Sprint-2/implement_skip_list/skip_list.py | 44 +++++++++++------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/Sprint-2/implement_skip_list/skip_list.py b/Sprint-2/implement_skip_list/skip_list.py index 710faad..96cc1a9 100644 --- a/Sprint-2/implement_skip_list/skip_list.py +++ b/Sprint-2/implement_skip_list/skip_list.py @@ -23,49 +23,49 @@ def _random_level(self): def insert(self, value): update = [None] * (self.MAX_LEVEL + 1) - x = self.head + current = self.head # Find the place where the new value should go - for i in range(self.level, -1, -1): - while x.next[i] and x.next[i].value < value: - x = x.next[i] - update[i] = x + for level in range(self.level, -1, -1): + while current.next[level] and current.next[level].value < value: + current = current.next[level] + update[level] = current - x0 = x.next[0] - if x0 and x0.value == value: + next_node = current.next[0] + if next_node and next_node.value == value: return node_level = self._random_level() if node_level > self.level: - for i in range(self.level + 1, node_level + 1): - update[i] = self.head + for level in range(self.level + 1, node_level + 1): + update[level] = self.head self.level = node_level new_node = Node(value, node_level) - for i in range(node_level + 1): - new_node.next[i] = update[i].next[i] - update[i].next[i] = new_node + for level in range(node_level + 1): + new_node.next[level] = update[level].next[level] + update[level].next[level] = new_node # Check if value exists def contains(self, value): - x = self.head - for lvl in range(self.level, -1, -1): - while x.next[lvl] and x.next[lvl].value < value: - x = x.next[lvl] + current = self.head + for level in range(self.level, -1, -1): + while current.next[level] and current.next[level].value < value: + current = current.next[level] - x = x.next[0] - return x is not None and x.value == value + candidate = current.next[0] + return candidate is not None and candidate.value == value def __contains__(self, value): return self.contains(value) def to_list(self): result = [] - x = self.head.next[0] - while x: - result.append(x.value) - x = x.next[0] + current = self.head.next[0] + while current: + result.append(current.value) + current = current.next[0] return result