python3.6实现跳表

本文介绍如何在Python3.6中实现跳表数据结构,包括节点类定义、随机确定节点高度的函数、last数组用于动态操作、查找、插入、删除及输出跳表的方法,并提供了测试用例和运行结果。
摘要由CSDN通过智能技术生成

实现:

原理什么的别人的博客有很多,我这就给个链接。
数据结构—–跳表
跳表 skiplist

使用一个类表示跳表的节点



#跳跃表节点的类

class SNode:

    def __init__(self,key=None,value=None):

        #键
        self.key=key
        #index表示数组中最末的元素
        self.maxIndex=-1
        #link使用一个数组  存放全部下节点的索引  link[i]表示第i层的索引
        self.link=[]
        self.value=value

跳表类 的构造方法

class SkipList:
    def __init__(self,size=8,larger=65535):
        #深度
        self.size = size
        '''
        跳跃表的深度和你的数据有关  大约为 log n   
        '''
        #尾节点指针
        self.tial=SNode()
        #头结点指针   存放头结点
        self.head=SNode()
        #存放在插入和删除操作中  每一个链上遇到的最后节点
        self.last=[]
        self.tial.key=larger#表示尾节点

        self.head.key=-65535#表示节点

        #头结点的全部指针指向尾节点
        for i in range(self.size):

            self.head.link.append(self.tial)

        self.MAX_RAND=self.size

由于跳表的节点高度是随机的 要用一个函数 确定

 #随机分配层数  但是不会超过最大层数
    def randomDispenseLevel(self):
         level=1
         while random.randint(0,1)==1:
             level+=1
         return  level if level<=self.MAX_RAND else self.MAX_RAND

last数组用来保存动态操作(插入和删除) 某节点后该节点前面的节点

  #获取last数组里的值
    def getLast(self,data):
        #print(data)
        num = self.size - 1      #数组存储时是自底向上    查找是自顶向下   所以num表示层数
        p = self.head
        while num >= 0:
            while p.link[num].key <data:#和进行一次查找一样 如果小于,说明这个节点是待动态操作节点的前一个节点
                p = p.link[num]
            num -= 1

            self.last.append(p if p != None  else self.head)#如果节点不是空就加入last里

        return  self.last[len(self.last)-1]#p指向最底层的节点

查找

    def find(self,data):
        FLAGE=False#标准位   查询是否成功
        temp=self.head #temp开始存放头指针
        i=self.size-1 #i是最大长度-1   因为是从上往下找
        while i>=0: #如果没有越界
            if temp.link[i].key==self.tial.key:#如果到达最后的尾指针 说明当前层没有要找的节点

                i-=1
                continue
            if temp.link[i].key<data:#如果小于待查找的数据  说明要将节点切换到下一个节点

                temp=temp.link[i]

                i=len(temp.link)-1
            elif temp.link[i].key==data:#如果相等说明找到了
                FLAGE=True

                return  temp.link[i],FLAGE
            else:
                if i>0:#如果没找到  切没有到最后一层  直接下降一层

                    i-=1
                else:
                    return temp,FLAGE
        return     temp,FLAGE

插入

    def 
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值