Skiplist简介

看了这篇文章大概知道了skiplist的原理

https://blog.youkuaiyun.com/ict2014/article/details/17394259/

Skiplist首先是有序存储的,然后每个节点的后续节点数是random的(至少为2)

这样的结构查找效率会比较高,单链表的查询效率为O(n),Skiplist是O(logN),



后续看代码(代码不知道什么时候看了。。。)

### Python 中 Skip List 的实现与用法 #### 跳跃表简介 跳跃表(Skip List)是一种支持快速搜索、插入和删除操作的数据结构,这些操作的时间复杂度平均为 O(log N)[^4]。跳跃表由 William Pugh 在 1990 年提出,最初用于优化无序数组中的元素查找。 #### 基本概念 跳跃表通过构建多层索引来加速查询过程。每一层都是一个有序链表,上一层的节点会指向下一层的部分节点,从而形成一种分层次的链接关系。最底层包含了所有的元素,而高层则逐渐减少节点数量,直到顶层可能只包含头尾两个哨兵节点。 #### Python 实现 下面是一个简单的 Python 版本的跳跃表示例: ```python import random class Node: __slots__ = 'value', 'forwards' def __init__(self, value=None, level=0): self.value = value self.forwards = [None] * (level + 1) class Skiplist: def __init__(self, p=0.5, max_level=16): self.head = Node(level=max_level) self.max_level = max_level self.p = p self.level = 0 def _random_level(self): lvl = 0 while random.random() < self.p and lvl < self.max_level: lvl += 1 return lvl def search(self, target: int) -> bool: current = self.head for i in reversed(range(self.level + 1)): while current.forwards[i] and current.forwards[i].value < target: current = current.forwards[i] next_node = current.forwards[0] if next_node and next_node.value == target: return True return False def add(self, num: int) -> None: update = [None] * (self.max_level + 1) current = self.head for i in reversed(range(self.level + 1)): while current.forwards[i] and current.forwards[i].value < num: current = current.forwards[i] update[i] = current new_level = self._random_level() if new_level > self.level: for i in range(self.level + 1, new_level + 1): update[i] = self.head self.level = new_level node = Node(num, new_level) for i in range(new_level + 1): node.forwards[i] = update[i].forwards[i] update[i].forwards[i] = node def erase(self, num: int) -> bool: update = [None] * (self.max_level + 1) current = self.head for i in reversed(range(self.level + 1)): while current.forwards[i] and current.forwards[i].value < num: current = current.forwards[i] update[i] = current current = current.forwards[0] if not current or current.value != num: return False for i in range(len(current.forwards)): if update[i].forwards[i] != current: break update[i].forwards[i] = current.forwards[i] while self.level > 0 and not self.head.forwards[self.level]: self.level -= 1 del current return True ``` 此代码定义了一个 `Node` 类来存储单个节点的信息以及一个 `Skiplist` 类来进行实际的操作管理。其中 `_random_level()` 方法用来决定新加入节点应该位于哪几层;`search()` 查找给定值是否存在;`add()` 插入新的数值;最后 `erase()` 移除指定的数值[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值