Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions Sprint-2/implement_skip_list/skip_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import random


class _Node:
def __init__(self, value, level):
self.value = value
# forward[i] is the next node at level i
self.forward = [None] * (level + 1)


class SkipList:
MAX_LEVEL = 16
P = 0.5 # probability for level increase

def __init__(self):
# head is a dummy node with no value but MAX_LEVEL pointers
self.head = _Node(None, self.MAX_LEVEL)
self.level = 0 # current highest level in use
self.size = 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):
"""Insert value in sorted order."""
update = [None] * (self.MAX_LEVEL + 1)
current = self.head

# 1) Search for position from top level down
for lvl in range(self.level, -1, -1):
while current.forward[lvl] is not None and current.forward[lvl].value < value:
current = current.forward[lvl]
update[lvl] = current

# 2) Check if already present -> do nothing
next_node = current.forward[0]
if next_node is not None and next_node.value == value:
return

# 3) Choose random level for new node
new_level = self._random_level()
if new_level > self.level:
for i in range(self.level + 1, new_level + 1):
update[i] = self.head
self.level = new_level

# 4) Insert node, fixing pointers at each level
new_node = _Node(value, new_level)
for i in range(new_level + 1):
new_node.forward[i] = update[i].forward[i]
update[i].forward[i] = new_node

self.size += 1

def __contains__(self, value):
"""Implements `value in sl` using fast skip-list search."""
current = self.head
for lvl in range(self.level, -1, -1):
while current.forward[lvl] is not None and current.forward[lvl].value < value:
current = current.forward[lvl]
current = current.forward[0]
return current is not None and current.value == value

def to_list(self):
"""Return all values in sorted order from the bottom level."""
result = []
current = self.head.forward[0]
while current is not None:
result.append(current.value)
current = current.forward[0]
return result