前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Skiplist跳表的通俗理解

Skiplist跳表的通俗理解

原创
作者头像
一点一线
发布2022-04-02 00:59:41
3810
发布2022-04-02 00:59:41
举报
文章被收录于专栏:计算机技术计算机技术

SkipList通俗理解就是一个多层链表,并且数据是有序排列。通常我们理解的链表只有一层,一个节点指向排列中的下一个节点。

比方说公司层级分为:总经理-部门经理-总监-组长-基层员工。

通常说的链表就是严格的层级管理,那么是这样的管理结构:总经理-部门经理-总监-组长-基层员工。每一层管理下一层级的员工。

跳表就是跨越层级的管理,这种管理结构就存在多样性了:

  1. 总经理-部门经理-总监-组长-基层员工。 这一管理层级肯定存在。
  2. 总经理-部门经理-组长-基层员工。这一管理层级可能存在。
  3. 总经理-组长-基层员工。这一管理层级可能存在。
  4. 总经理-基层员工。这一管理层级可能存在。

这种跨层管理就是跳表,跳表有什么好处就是执行命令速度快,总经理可以直接给基层员工安排任务。所以跳表要解决的问题就是提高有序表的查询速度。

下面我们看一下python代码是实现skiplist的基本功能。

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档