跳表
import random
class Node():
def __init__(self,data):
self.data = data
self.right = None
self.down = None
class SkipList():
MAX_LEVEL = 8
def __init__(self):
self.level = 0
self.dummy_node_of_skiplist = []
for i in range(self.MAX_LEVEL):
node = Node(None)
if i > 0:
node.down = self.dummy_node_of_skiplist[i-1]
self.dummy_node_of_skiplist.append(node)
def search(self, num):
ptr = self.dummy_node_of_skiplist[self.level]
while True:
if ptr.right and ptr.right.data <= num:
ptr = ptr.right
if ptr.data == num:
return True
elif ptr.down:
ptr = ptr.down
else:
break
return False
def erase(self, num):
if(self.search(num) == True):
for i in range(self.level + 1):
ptr = self.dummy_node_of_skiplist[i]
while ptr.right:
if ptr.right.data == num:
ptr.right = ptr.right.right
else:
ptr = ptr.right
def add(self, num):
new_level = self.random_level()
if (new_level > self.level):
self.level = new_level
for i in range(new_level + 1):
cur = self.dummy_node_of_skiplist[i]
if cur.right != None and cur.right.data < num:
cur = cur.right
new_node = Node(num)
new_node.right = cur.right
cur.right = new_node
if(i == 0):
temp_node = new_node
else:
new_node.down = temp_node
temp_node = new_node
print('current level := ', new_level, ",num := ", num)
def random_level(self,p = 0.2):
level = 0
while random.random() < p and level < self.MAX_LEVEL:
level += 1
if level > self.MAX_LEVEL:
level = self.MAX_LEVEL
return level
skiplist = SkipList()
skiplist.add(22)
skiplist.add(19)
skiplist.add(7)
skiplist.add(4)
print(skiplist.search(19))
skiplist.erase(19)
print(skiplist.search(19))