SkipList通俗理解就是一个多层链表,并且数据是有序排列。通常我们理解的链表只有一层,一个节点指向排列中的下一个节点。
比方说公司层级分为:总经理-部门经理-总监-组长-基层员工。
通常说的链表就是严格的层级管理,那么是这样的管理结构:总经理-部门经理-总监-组长-基层员工。每一层管理下一层级的员工。
跳表就是跨越层级的管理,这种管理结构就存在多样性了:
这种跨层管理就是跳表,跳表有什么好处就是执行命令速度快,总经理可以直接给基层员工安排任务。所以跳表要解决的问题就是提高有序表的查询速度。
下面我们看一下python代码是实现skiplist的基本功能。
import random
max_level = 10
class SkipList(object):
def __init__(self):
self.header = Node()
def insert(self, data):
p = self.header
level = random.randint(1, max_level)
path = [None] * level
for i in range(level):
path[i] = self.header.forward[i]
for i in range(level - 1, -1, -1):
while p.forward[i] is not None and p.forward[i].val < data:
p = p.forward[i]
path[i] = p
if p.forward[0] is not None and p.forward[0].val == data:
return
newNode = Node()
newNode.val = data
for i in range(level):
newNode.forward[i] = path[i].forward[i]
path[i].forward[i] = newNode
def delete(self, data):
p = self.header
path = [None] * max_level
for i in range(max_level-1, -1, -1):
while p.forward[i] is not None and p.forward[i].val < data:
p = p.forward[i]
path[i] = p
if p.forward[0] is not None and p.forward[0].val == data:
for i in range(max_level -1, -1, -1):
if path[i].forward[i] is not None and path[i].forward[i].val == data :
path[i].forward[i] = path[i].forward[i].forward[i]
else:
path[i].forward[i] = None
def search(self, data):
p = self.header
for i in range(max_level, -1, -1):
while len(p.forward) > i and p.forward[i] is not None and p.forward[i].val < data:
p = p.forward[i]
if p.forward[0] is not None and p.forward[0].val == data:
return True
return False
def print(self):
for i in range(max_level):
p = self.header
s = str(i) + "层 : "
while p.forward[i] is not None:
s = s + str(p.forward[i].val) + ","
p = p.forward[i]
print(s)
class Node(object):
def __init__(self):
self.val = 0
self.forward = [None] * max_level
if __name__ == '__main__':
skip_list = SkipList()
skip_list.insert(4)
skip_list.insert(2)
skip_list.insert(6)
skip_list.print()
skip_list.delete(4)
print("after delete 4")
skip_list.print()
ret = skip_list.search(2)
print(2, "find", ret)
ret = skip_list.search(4)
print(4, "find", ret)
skip_list.insert(3)
skip_list.print()
ret = skip_list.search(3)
print(3, "find", ret)
运行结果:
0层 : 2,4,6,
1层 : 2,6,
2层 : 2,6,
3层 : 2,
4层 :
5层 :
6层 :
7层 :
8层 :
9层 :
after delete 4
0层 : 2,6,
1层 : 2,
2层 : 2,
3层 : 2,
4层 :
5层 :
6层 :
7层 :
8层 :
9层 :
2 find True
4 find False
0层 : 2,3,6,
1层 : 2,3,
2层 : 2,3,
3层 : 2,3,
4层 : 3,
5层 :
6层 :
7层 :
8层 :
9层 :
3 find True
更多内容请关注微信公众号: IT技术漫漫谈
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。