From bde4dbca76439d7a1e4fe1857e70fadfe7a9505c Mon Sep 17 00:00:00 2001 From: Faithy4444 <161722786+Faithy4444@users.noreply.github.com> Date: Sat, 25 Oct 2025 00:00:58 +0200 Subject: [PATCH 1/2] skip list implimentation 1 --- Sprint-2/implement_skip_list/skip_list.py | 61 +++++++++++++++++++++++ 1 file changed, 61 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..92b90f3 --- /dev/null +++ b/Sprint-2/implement_skip_list/skip_list.py @@ -0,0 +1,61 @@ +import random + +class Node: + def __init__(self, value, level): + self.value = value + self.forward = [None] * (level + 1) # forward pointers for each level + +class SkipList: + MAX_LEVEL = 16 + P = 0.5 + + def __init__(self): + self.header = Node(None, self.MAX_LEVEL) + self.level = 0 + + 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) + current = self.header + + # Move down from top level to bottom to find insert positions + for i in reversed(range(self.level + 1)): + while current.forward[i] and current.forward[i].value < value: + current = current.forward[i] + update[i] = current + + current = current.forward[0] + + # Insert only if not already present + if current is None or current.value != value: + lvl = self.random_level() + if lvl > self.level: + for i in range(self.level + 1, lvl + 1): + update[i] = self.header + self.level = lvl + + new_node = Node(value, lvl) + for i in range(lvl + 1): + new_node.forward[i] = update[i].forward[i] + update[i].forward[i] = new_node + + def contains(self, value): + current = self.header + for i in reversed(range(self.level + 1)): + while current.forward[i] and current.forward[i].value < value: + current = current.forward[i] + current = current.forward[0] + return current is not None and current.value == value + + def to_list(self): + result = [] + current = self.header.forward[0] + while current: + result.append(current.value) + current = current.forward[0] + return result From d7e37f935fb0c1973b916c89574b7816a68504e2 Mon Sep 17 00:00:00 2001 From: Faithy4444 <161722786+Faithy4444@users.noreply.github.com> Date: Sat, 25 Oct 2025 00:02:51 +0200 Subject: [PATCH 2/2] skip list made iterable --- Sprint-2/implement_skip_list/skip_list.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Sprint-2/implement_skip_list/skip_list.py b/Sprint-2/implement_skip_list/skip_list.py index 92b90f3..568929c 100644 --- a/Sprint-2/implement_skip_list/skip_list.py +++ b/Sprint-2/implement_skip_list/skip_list.py @@ -7,11 +7,11 @@ def __init__(self, value, level): class SkipList: MAX_LEVEL = 16 - P = 0.5 + P = 0.5 # probability for random level def __init__(self): self.header = Node(None, self.MAX_LEVEL) - self.level = 0 + self.level = 0 # current max level in list def random_level(self): lvl = 0 @@ -59,3 +59,10 @@ def to_list(self): result.append(current.value) current = current.forward[0] return result + + # Make SkipList iterable + def __iter__(self): + current = self.header.forward[0] + while current: + yield current.value + current = current.forward[0]