首页 > 其他分享 >跳表与二叉搜索树

跳表与二叉搜索树

时间:2024-03-24 15:57:14浏览次数:16  
标签:node 元素 二叉 插入 跳表 搜索 next

跳表与二叉搜索树

跳表与二叉搜索树

本文探索跳表与二叉搜索树的一些相似之处, 以此来加深对跳表结构的深入理解

适用场景

跳表在Redis中有比较广泛的使用Redis

技术要点

我们可以认定跳表本质上就是一个平衡二叉搜索树, 跳表的目标是为了能够快速的定位key所在的index

所以可以认定的是跳表的底层数据必定有序

节点内容

我们可以认为跳表的每层节点要保存的数据是

struct node {
  key: comparable,
  index: usize,
  next: node,
  next_level_node: node
}

即每一个node的都至少要包含一个用来判断大小的key, 以及一个值记录比自己更大的节点的数量(即下标)

查询

在查询跳表时, 假设有有两个node : now以及next

当查询的值大于 now又小于next时, 会进入now的下一层, 直到next比自己更大或者相等

重复此过程, 如果到达了实际的数据层依然不存在指定数据, 意味着该数据不存在

插入

按照查询流程进行可以得到一条路径

如果不存在插入值, 路径上的所有node 的index都需要加一

如果存在插入值, 返回插入失败

删除

插入流程的反向操作, index - 1

注意要点

跳表在进行插入或者删除操作的时候, 可能会产生类似平衡二叉树的重平衡操作, 这一点需要注意

辨析

为什么使用redis使用跳表而不是二叉搜索树?

因为跳表对于范围区间查询支持更好一些

参考文档

数据结构——跳表skip list_跳表插入_Overcautious的博客-CSDN博客 转载:Skip List–跳表理解跳表,从单链表开始说起下图是一个简单的有序单链表,单链表的特性就是每个元素存放下一个元素的引用。即:通过第一个元素可以找到第二个元素,通过第二个元素可以找到第三个元素,依次类推,直到找到最后一个元素。什么是跳表?跳表的查找、插入、删除元素的流程跳表查找、插入、删除元素的时间复杂度跳表插入元素时,如何动态维护索引?为什么Redis选择使用跳表而不是红黑树来实现有序集 https://blog.csdn.net/qq_44700810/article/details/124355344

标签:node,元素,二叉,插入,跳表,搜索,next
From: https://www.cnblogs.com/pDJJq/p/18092517/jump-watch-and-binary-search-tree-z1isf6w

相关文章

  • 搜索基础
    目录八皇后八数码红与黑八皇后在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=110;intn=8,data[N][10],tt;inta[10];//a[y]=x(x,y)有皇后intb[10];//b[y]=1......
  • 【机器学习-08】参数调优宝典:网格搜索与贝叶斯搜索等攻略
    超参数是估计器的参数中不能通过学习得到的参数。在scikit-learn中,他们作为参数传递给估计器不同类的构造函数。典型的例子有支持向量分类器的参数C,kernel和gamma,Lasso的参数alpha等。​在超参数集中搜索以获得最佳crossvalidation交叉验证分数的方法是可实现并且推荐的......
  • JS 二叉搜索树
    Code:classTreeNode{val;left;right;constructor(val,left,right){this.val=val??0;this.left=left?left:null;this.right=right?right:null;}}/***二叉搜索树*/classBinarySearchTree{......
  • 数据结构(五)——二叉树的遍历和线索二叉树
    5.3.二叉树的遍历和线索二叉树5.3.1_1二叉树的先中后序遍历遍历:按照某种次序把所有结点都访问一遍二叉树的递归特性:        ①要么是个空二叉树        ②要么就是由“根节点+左子树+右子树”组成的二叉树先序遍历:根左右(NLR)中序遍历:左根右(LNR)后序遍......
  • antdesign protable 修改搜索区Form item的placeholder
    默认protable搜索去的placeholder为请输入或者请选择: 需要修改为其他内容,配置 constcolumns=[  {   title:'项目',   dataIndex:'project',   valueEnum:currentUser.projects.reduce((r,c)=>{    r[c]=c;    re......
  • leedcode-二叉树的所有路径
    迭代法-深度优先搜索classSolution:defbinaryTreePaths(self,root:Optional[TreeNode])->List[str]:ifnotroot:return[]#如果根节点为空,直接返回空列表stack=[(root,str(root.val))]#初始化栈,栈中存储的是节点......
  • 【Java】二叉搜索树
    文章目录一、搜索树二、使用代码实现一棵二叉搜索树1.查找2.插入3.删除(重点)总结一、搜索树二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节......
  • 一道平衡二叉树的求解
    最近在看二叉树的算法,我觉得有点迷迷糊糊,就是那种一看就会,一写就费。我有点很奇怪的感觉,就感觉二叉树的很多问题,其实在于一步一步的遍历(或者称为迭代,或者是递归方法),然后在遍历的基础上进行逻辑(业务)操作。首先在这讲一下递归。递归有三部曲:一.确定函数参数,确定函数的返回值......
  • 二叉树的创建,遍历与销毁
    二叉树的创建,遍历与销毁#include<iostream>#include<bits/stdc++.h>usingnamespacestd;structTreeNode{ charval;//数据域 TreeNode*lchild;//左子树 TreeNode*rchild;//右子树};classBiTree{ private: TreeNode*root;//根节点 public: BiTree()......
  • 1.基于搜索的路径规划:BFS、DFS、Dijkstra、A*、JPS
    1.概览可以对比不同算法的小动画 PathFinding.js(qiao.github.io)工作空间规划机器人有不同的形状和大小碰撞检测需要了解机器人的几何形状,耗时且难度大 我们希望将机器人表示为点,只需要把工作空间转换为配置空间C-obstacle,将原始的空间膨胀,这是一次性的C-space......