0
点赞
收藏
分享

微信扫一扫

Python写一个跳表

Mezereon 2022-03-13 阅读 97
python

跳表

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))

举报

相关推荐

0 条评论