Skip List原理和实现

Implement skip list in python

import random

class SkipNode:
    def __init__(self, key=None, value=None, level=0):
        self.key = key
        self.value = value
        self.forward = [None] * level
        
class SkipList:
    def __init__(self, max_level=16):
        self.head = SkipNode()
        self.max_level = max_level
        self.level = 0
    
    def random_level(self):
        level = 1
        while random.random() < 0.5 and level < self.max_level:
            level += 1
        return level
    
    def search(self, key):
        node = self.head
        for i in range(self.level-1, -1, -1):
            while node.forward[i] and node.forward[i].key < key:
                node = node.forward[i]
        if node.forward[0] and node.forward[0].key == key:
            return node.forward[0].value
        return None
    
    def insert(self, key, value):
        update = [None] * self.max_level
        node = self.head
        for i in range(self.level-1, -1, -1):
            while node.forward[i] and node.forward[i].key < key:
                node = node.forward[i]
            update[i] = node
        node = node.forward[0]
        if node and node.key == key:
            node.value = value
        else:
            level = self.random_level()
            if level > self.level:
                for i in range(self.level, level):
                    update[i] = self.head
                self.level = level
            node = SkipNode(key, value, level)
            for i in range(level):
                node.forward[i] = update[i].forward[i]
                update[i].forward[i] = node
    
    def delete(self, key):
        update = [None] * self.max_level
        node = self.head
        for i in range(self.level-1, -1, -1):
            while node.forward[i] and node.forward[i].key < key:
                node = node.forward[i]
            update[i] = node
        node = node.forward[0]
        if node and node.key == key:
            for i in range(self.level):
                if update[i].forward[i] != node:
                    break
                update[i].forward[i] = node.forward[i]
            while self.level > 1 and not self.head.forward[self.level-1]:
                self.level -= 1
        else:
            raise ValueError('Key not found')

本文由 络壳 原创或整理,转载请注明出处