查看其它 2 个回答lxue的回答

lxuelxue数据库管理员某互联网公司

在做范围查找的时候,平衡树比 skiplist 操作要复杂。在平衡树上,我们找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点。如果不对平衡树进行一定的改造,这里的中序遍历并不容易实现。而在 skiplist 上进行范围查找就非常简单,只需要在找到小值之后,对第 1 层链表进行若干步的遍历就可以实现。

平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而 skiplist 的插入和删除只需要修改相邻节点的指针,操作简单又快速。

从内存占用上来说, skiplist 比平衡树更灵活一些。一般来说,平衡树每个节点包含 2 个指针(分别指向左右子树),而 skiplist 每个节点包含的指针数目平均为 1/(1-p) ,具体取决于参数 p 的大小。如果像 Redis 里的实现一样,取 p=1/4 ,那么平均每个节点包含 1.33 个指针,比平衡树更有优势。

查找单个 key , skiplist 和平衡树的时间复杂度都为 O(log n) ,大体相当;而哈希表在保持较低的哈希值冲突概率的前提下,查找时间复杂度接近 O(1) ,性能更高一些。所以我们平常使用的各种 Map 或 dictionary 结构,大都是基于哈希表实现的。

从算法实现难度上来比较, skiplist 比平衡树要简单得多。

互联网服务 · 2020-02-24
浏览3517

回答者

lxue
lxue006
数据库管理员某互联网公司
擅长领域: 数据库人工智能大数据

lxue 最近回答过的问题

回答状态

  • 发布时间:2020-02-24
  • 关注会员:4 人
  • 回答浏览:3517
  • X社区推广