跳表(Skip List)是对链表改造后的动态数据结构,利用空间换时间的思想,建立多级索引来提高查找、插入、删除操作的效率。
一层一层索引有点类似二分查找这种分而治之的思想。
在跳表中查询一个数据的时间复杂度是O( log n ),空间复杂度是O( n )。
跳表通过随机函数来维护平衡性,即索引大小与原始链表大小之间的平衡,不至于性能过度退化,有效平衡执行效率和内存消耗。通过随机函数,来决定将这个结点插入到哪几级索引中,比如随机函数生成了值K,那就将结点添加到第一级到第K级这K级索引中。
以下是用python3的具体实现。
from typing import Optional
import random
class ListNode:
def __init__(self, data: Optional[int] = None):
self._data = data
self._forwards = []
class SkipList:
_MAX_LEVEL = 16
def __init__(self):
self._level_count = 1
self._head = ListNode()
self._head._forwards = [None] * type(self)._MAX_LEVEL
def find(self, value: int) -> Optional[ListNode]: # 查找