当前位置: 首页 > article >正文

数据结构之伸展树(Splay Tree)详解

伸展树Splay Tree详解目录引言伸展树的基本概念伸展操作伸展树的操作插入操作查找操作删除操作时间复杂度分析伸展树与其他平衡二叉搜索树的比较应用场景代码实现示例总结引言伸展树Splay Tree是一种自调整的二叉搜索树由Daniel Sleator和Robert Tarjan在1985年提出。它通过一种称为伸展splay的特殊操作将最近访问的节点移动到根节点附近从而提高后续访问的效率。与传统的平衡二叉搜索树如AVL树、红黑树不同伸展树不保证树在任何时刻都保持平衡。相反它通过动态调整树的结构使得频繁访问的节点更靠近根节点从而在长期运行中实现良好的平均性能。伸展树的基本概念节点结构伸展树的每个节点包含以下信息键值Key左子节点Left Child右子节点Right Child父节点Parent伸展树的特点自调整性通过伸展操作最近访问的节点会被移动到根节点附近局部性原理利用程序访问的局部性提高频繁访问节点的访问速度摊还时间复杂度虽然单次操作可能较慢但摊还时间复杂度为O(log n)简单性实现相对简单不需要存储平衡因子或颜色信息伸展操作伸展操作是伸展树的核心它通过一系列旋转将目标节点移动到根节点。伸展操作通常分为三种情况1. Zig单旋转当目标节点的父节点是根节点时进行单旋转右旋转Zigy x / \ / \ x C -- A y / \ / \ A B B C左旋转Zagy x / \ / \ A x -- y C / \ / \ B C A B2. Zig-Zig双旋转同向当目标节点、其父节点和祖父节点都在同一方向时进行双旋转左-左情况LLz x / \ / \ y D -- A y / \ / \ x C B z / \ / \ A B C D右-右情况RRz x / \ / \ A y -- y D / \ / \ B x z C / \ / \ C D A B3. Zig-Zag双旋转异向当目标节点、其父节点和祖父节点不在同一方向时进行双旋转左-右情况LRz x / \ / \ y D -- y z / \ / \ / \ A x A B C D / \ B C右-左情况RLz x / \ / \ A y -- z y / \ / \ / \ x D A B C D / \ B C伸展树的操作插入操作伸展树的插入操作分为以下步骤按照二叉搜索树的规则找到插入位置插入新节点对新插入的节点执行伸展操作将其移动到根节点查找操作伸展树的查找操作分为以下步骤按照二叉搜索树的规则查找目标节点如果找到目标节点执行伸展操作将其移动到根节点如果未找到目标节点对最后访问的节点执行伸展操作删除操作伸展树的删除操作分为以下步骤查找要删除的节点如果找到节点执行伸展操作将其移动到根节点删除根节点并将左右子树合并对新的根节点执行伸展操作时间复杂度分析伸展树的时间复杂度分析基于摊还分析查找操作摊还时间复杂度为O(log n)插入操作摊还时间复杂度为O(log n)删除操作摊还时间复杂度为O(log n)虽然单次操作的最坏情况时间复杂度可能达到O(n)但由于伸展操作的自我调整特性频繁访问的节点会被移动到根节点附近从而在长期运行中保持良好的性能。伸展树与其他平衡二叉搜索树的比较特性伸展树AVL树红黑树平衡保证无严格平衡近似平衡插入/删除复杂度简单复杂中等查找性能局部性优化稳定稳定实现复杂度低中等高额外空间无平衡因子颜色信息适用场景频繁访问局部数据通用平衡树通用平衡树应用场景缓存系统利用局部性原理提高热点数据的访问速度文件系统优化频繁访问的文件和目录内存管理管理频繁使用的内存块网络路由优化路由表的查找性能数据库索引优化热点数据的索引访问代码实现示例以下是一个简单的伸展树Python实现classSplayTreeNode:def__init__(self,key):self.keykey self.leftNoneself.rightNoneself.parentNoneclassSplayTree:def__init__(self):self.rootNonedefright_rotate(self,x):yx.left x.lefty.rightify.right:y.right.parentx y.parentx.parentifnotx.parent:self.rootyelifxx.parent.right:x.parent.rightyelse:x.parent.lefty y.rightx x.parentydefleft_rotate(self,x):yx.right x.righty.leftify.left:y.left.parentx y.parentx.parentifnotx.parent:self.rootyelifxx.parent.left:x.parent.leftyelse:x.parent.righty y.leftx x.parentydefsplay(self,x):whilex.parent:ifnotx.parent.parent:ifxx.parent.left:self.right_rotate(x.parent)else:self.left_rotate(x.parent)elifx.parent.leftxandx.parent.parent.leftx.parent:self.right_rotate(x.parent.parent)self.right_rotate(x.parent)elifx.parent.rightxandx.parent.parent.rightx.parent:self.left_rotate(x.parent.parent)self.left_rotate(x.parent)elifx.parent.leftxandx.parent.parent.rightx.parent:self.right_rotate(x.parent)self.left_rotate(x.parent.parent)else:self.left_rotate(x.parent)self.right_rotate(x.parent.parent)definsert(self,key):nodeSplayTreeNode(key)yNonexself.rootwhilex:yxifnode.keyx.key:xx.leftelse:xx.right node.parentyifnoty:self.rootnodeelifnode.keyy.key:y.leftnodeelse:y.rightnode self.splay(node)defsearch(self,key):xself.root lastNonewhilexandx.key!key:lastxifkeyx.key:xx.leftelse:xx.rightifx:self.splay(x)returnxiflast:self.splay(last)returnNonedefdelete(self,key):nodeself.search(key)ifnode:self.splay(node)left_subtreenode.left right_subtreenode.rightifleft_subtree:left_subtree.parentNoneifright_subtree:right_subtree.parentNoneifleft_subtree:self.rootleft_subtree max_leftself.maximum(left_subtree)self.splay(max_left)max_left.rightright_subtreeifright_subtree:right_subtree.parentmax_leftelse:self.rootright_subtreereturnnodereturnNonedefmaximum(self,node):whilenode.right:nodenode.rightreturnnode总结伸展树是一种独特而强大的数据结构它通过自我调整的特性在保持简单实现的同时提供了良好的平均性能。其核心思想是利用程序的局部性原理将频繁访问的节点移动到根节点附近从而提高后续访问的速度。伸展树的主要优势包括实现简单不需要存储额外的平衡信息在频繁访问局部数据的场景下表现优异摊还时间复杂度保证为O(log n)适用于缓存、文件系统等需要优化热点数据访问的场景虽然伸展树在最坏情况下可能表现不佳但在实际应用中由于其自调整特性通常能够提供比传统平衡树更好的性能特别是在具有访问局部性的应用场景中。

相关文章:

数据结构之伸展树(Splay Tree)详解

伸展树(Splay Tree)详解 目录 引言伸展树的基本概念伸展操作伸展树的操作 插入操作查找操作删除操作 时间复杂度分析伸展树与其他平衡二叉搜索树的比较应用场景代码实现示例总结 引言 伸展树(Splay Tree)是一种自调整的二叉搜…...

Win11Debloat:通过系统精简与优化实现Windows性能提升的自动化方案

Win11Debloat:通过系统精简与优化实现Windows性能提升的自动化方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to decl…...

FastAdmin自定义Excel导入功能:从数据读取到灵活处理

1. 为什么需要自定义Excel导入功能 FastAdmin自带的Excel导入功能虽然开箱即用,但在实际项目中经常会遇到各种限制。最常见的问题就是系统强制要求Excel表头必须与数据库字段备注完全一致,这种强耦合的设计会导致三个主要痛点: 首先&#xff…...

从需求到代码:基于快马平台快速构建javaweb在线考试系统实战

今天想和大家分享一个实战项目——基于SpringBootVue的在线考试系统。这个系统从需求分析到代码实现,我全程使用了InsCode(快马)平台来加速开发流程,效果出乎意料的好。 系统架构设计 采用前后端分离架构,后端使用SpringBootSpringSecurity&a…...

从零到一:手把手教你用TruckSim搭建你的第一辆虚拟牵引车模型

从零到一:手把手教你用TruckSim搭建你的第一辆虚拟牵引车模型 第一次打开TruckSim时,面对密密麻麻的参数和复杂的界面,很多新手会感到无从下手。作为一款专业的商用车动力学仿真软件,TruckSim确实有一定的学习门槛,但掌…...

开源智能体的安全第一课:OpenClaw案例

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…...

别再用临时邮箱了!用Python+Selenium自动化管理你的Augment AI多账户(附完整脚本)

构建可持续的Augment AI自动化账户管理系统 在AI辅助编程工具日益普及的今天,开发者们对高效工具的依赖程度越来越高。Augment AI作为一款强大的代码助手,其免费版本300次的使用限制常常成为开发者工作流中的瓶颈。传统解决方案如手动重置或使用临时邮箱…...

告别DCOM噩梦:手把手教你用KepOPC DA2UA中间件搞定OPC DA到UA的转换(附Python读写测试代码)

工业数据互通新范式:零配置实现OPC DA到UA的无缝迁移实战 如果你是一名工业自动化工程师,一定对这样的场景不陌生:凌晨两点还在客户现场调试DCOM配置,反复检查防火墙规则、用户权限和网络策略,却依然无法让OPC DA客户端…...

手把手教你学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量

目录 手把手教你学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量​ 摘要​ 一、背景与挑战​ 1.1 坡道重力扰动的痛点与传统控制局限​ 1.1.1 应用场景与核心指标​ 1.1.2 传统PI控制的缺陷​ 1.2 DOB控制的核心优势​ 1.3 设计目标​ 二、系统架构与D…...

YOLOv11卷积模块深度剖析:从参数解析到实战应用

1. YOLOv11卷积模块设计精要 第一次接触YOLOv11的配置文件时,我和大多数开发者一样被那些看似简单却暗藏玄机的参数搞得一头雾水。特别是当我在backbone部分看到[-1, 1, Conv, [64, 3, 2]]这样的配置时,直觉告诉我输出通道数应该是64,但实际运…...

高并发系统的“救命稻草”——BASE 理论

今天我们要聊的话题,是互联网架构的“遮羞布”,也是高并发系统的“救命稻草”——BASE 理论。如果说 ACID(原子性、一致性、隔离性、持久性)是传统数据库的“洁癖”,要求数据必须时刻保持完美,那 BASE 就是…...

Path of Building汉化版终极指南:5步掌握流放之路角色构建神器

Path of Building汉化版终极指南:5步掌握流放之路角色构建神器 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 还在为流放之路复杂的角色构建而头疼吗?PoeCharm作为Path of …...

在WSL2上搞定PyTorch模型转昇腾OM:我的Atlas 200DK部署踩坑实录

在WSL2上实现PyTorch模型到昇腾OM的高效转换:避坑指南与实战解析 对于希望在Windows环境下完成昇腾模型转换的开发者来说,WSL2提供了一个近乎完美的解决方案。本文将深入探讨如何在这一环境中高效完成从PyTorch到昇腾OM模型的完整转换流程,同…...

3个突破性方案让游戏玩家实现Steam创意工坊资源自由获取

3个突破性方案让游戏玩家实现Steam创意工坊资源自由获取 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 在数字娱乐日益普及的今天,Steam创意工坊作为游戏模组的重要…...

5分钟快速上手BepInEx:Unity游戏插件开发的终极解决方案

5分钟快速上手BepInEx:Unity游戏插件开发的终极解决方案 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx(Bepis Injector Extensible)是…...

HunyuanVideo-Foley保姆级教程:Docker Compose编排WebUI+API+Redis缓存

HunyuanVideo-Foley保姆级教程:Docker Compose编排WebUIAPIRedis缓存 1. 环境准备与快速部署 在开始之前,请确保您的硬件配置满足以下要求: 显卡:RTX 4090/4090D 24GB显存内存:≥120GBCPU:10核及以上磁盘…...

OpenLens节点和Pod菜单扩展完整指南:恢复Kubernetes管理的关键功能

OpenLens节点和Pod菜单扩展完整指南:恢复Kubernetes管理的关键功能 【免费下载链接】openlens-node-pod-menu Node and pod menus for OpenLens 项目地址: https://gitcode.com/gh_mirrors/op/openlens-node-pod-menu 引言:解决OpenLens 6.3.0的功…...

新手友好:借助快马平台的免费token轻松迈出AI应用开发第一步

作为一名刚接触AI开发的新手,我最近在InsCode(快马)平台上完成了一个文本摘要生成器的项目,整个过程非常顺畅。这个平台对初学者特别友好,尤其是提供了免费token,让我们可以零成本体验AI开发的乐趣。 理解token的概念 刚开始我对…...

Unity射线检测Raycast避坑指南:从LayerMask到HitInfo,新手最容易踩的5个坑

Unity射线检测Raycast避坑指南:从LayerMask到HitInfo的实战解析 在Unity开发中,射线检测(Raycast)就像游戏世界的触觉神经,它让虚拟物体有了"感知"能力。但这条看似简单的直线背后,却藏着不少让新手开发者抓狂的陷阱。…...

Qwen3-0.6B-FP8从部署到应用:完整流程详解,新手必看

Qwen3-0.6B-FP8从部署到应用:完整流程详解,新手必看 你是不是刚接触AI模型,看着各种复杂的部署命令和配置就头疼?想快速体验一个能聊天、能推理、还能帮你写东西的智能助手,但又担心自己的电脑配置不够,或…...

脑机接口(BCI)全景解析:从原理到产业,开发者入局指南

脑机接口(BCI)全景解析:从原理到产业,开发者入局指南 引言 从帮助渐冻症患者“开口说话”,到用“意念”操控无人机,脑机接口(BCI)正从科幻走进现实,成为“AI for Scienc…...

Docker网络扫盲:除了host.docker.internal,还有哪些方法能让Dify容器访问宿主机的服务?

Docker容器与宿主机通信的5种实战方案及选型指南 当你第一次在Docker容器里尝试连接宿主机上的MySQL或Redis服务时,那个经典的"Connection refused"错误可能会让你困惑不已。为什么明明在宿主机上运行得好好的服务,到了容器里用localhost就访问…...

Whisper.cpp 跨平台编译与语音识别实战指南

1. Whisper.cpp 是什么?能做什么? 第一次接触 Whisper.cpp 是在一个语音转文字的需求场景中。当时需要处理大量会议录音,但发现主流的语音识别工具要么需要联网,要么对硬件要求极高。直到发现了这个基于 C 实现的轻量级解决方案&a…...

AI建站工具避坑指南:10个高频问题与真相解答

面对AI建站这个新事物,心动的人多,但真正敢下手的人,心里都藏着不少问号。“这东西靠谱吗?”“我的数据会不会丢了?”“用这个做了网站,以后会不会被圈住?”这些顾虑非常正常。今天这篇文章&…...

Vue多文件学习项目综合案例——面经基础版,黑马vue教程

文章目录一、项目截图二、主要知识点三、main.js四、App.vue五、viewsArticle.vueArticleDetail.vueCollect.vueLayout.vueLike.vueUser.vuerouterindex.js一、项目截图 二、主要知识点 路由跳转路由传参缓存组件:keep-alive 三、main.js import Vue from vue im…...

Palworld存档工具:高效解决游戏存档格式转换与数据解析的技术方案

Palworld存档工具:高效解决游戏存档格式转换与数据解析的技术方案 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools Palworld存档工具是…...

Bifrost:三星固件处理的跨平台工具解决方案

Bifrost:三星固件处理的跨平台工具解决方案 【免费下载链接】SamloaderKotlin 项目地址: https://gitcode.com/gh_mirrors/sa/SamloaderKotlin 在三星设备的维护与开发过程中,固件管理始终是核心环节。无论是官方系统更新、自定义ROM开发还是设备…...

entr 社区贡献终极指南:从新手到核心开发者的快速成长路径

entr 社区贡献终极指南:从新手到核心开发者的快速成长路径 【免费下载链接】entr Run arbitrary commands when files change 项目地址: https://gitcode.com/gh_mirrors/en/entr entr 是一款轻量级文件变化监控工具,能够在文件发生变化时自动执行…...

AI辅助开发:让快马AI成为你的编程搭档,迭代优化openclaw风格代码

今天想和大家分享一个开发小技巧:如何用AI辅助工具快速迭代优化代码。最近我在做一个数据抓取的小项目,需要实现类似openclaw的功能,正好用InsCode(快马)平台的AI功能试了试,效果出乎意料的好。 基础功能实现 最开始我只需要一个简…...

颠覆单机局限:用Nucleus Co-op打造4人同屏游戏空间

颠覆单机局限:用Nucleus Co-op打造4人同屏游戏空间 【免费下载链接】splitscreenme-nucleus Nucleus Co-op is an application that starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/spl/sp…...