伸展树你需要了解一下

介绍

伸展树(Splay Tree)是一种平衡二叉搜索树,它能在O(log n)内完成插入、查找和删除操作。它是丹尼尔·斯立特Daniel Sleator 和 罗伯特·恩卓·塔扬Robert Endre Tarjan 在1985年发明的。
伸展树是一种自调整形式的二叉查找树,它会在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。具体来说,伸展树沿着从某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去。

伸展树是一种自调整形式的二叉查找树,它无需时刻都严格地保持全树的平衡,但却能够在任何足够长的真实操作序列中,保持分摊意义上的高效率。伸展树也不需要对基本的二叉树节点结构做任何附加的要求或改动,更不需要记录平衡因子或高度之类的额外信息,故适用范围更广。

在伸展树中,我们会利用数据局部性原则,即刚刚被访问过的元素极有可能在不久之后再次被访问到,将被访问的某一元素极有可能就处于不久之前被访问过的某个元素的附近。我们会把访问过的节点放置到树根处,以便于下次访问。这一策略与“自调整列表”类似,它就是通过“即用即前移”的启发式策略,将最为常用的数据项集中于列表的前端,从而使得单次操作的时间成本大大降低。

特性

伸展树是一种特殊的二叉查找树,其特性包括:

  1. 局部性 :伸展树会利用数据局部性特性,即访问过的节点会被放置到树根处,以便于下次访问。这种策略类似于“自调整列表”的“即用即前移”的启发式策略,将最为常用的数据项集中于列表的前端,从而使得单次操作的时间成本大大降低。
  2. 伸展性 :伸展树不需要记录平衡因子或高度之类的额外信息,因此适用范围更广。当某个节点被访问时,伸展树会通过旋转使该节点成为树根,这样下次要访问该节点时,能够迅速地访问到该节点。

主要特点

伸展树的主要特点包括:

  • 无需时刻保持全树的平衡,但在足够长的真实操作序列中,能保持分摊意义上的高效率。
    不需要对基本的二叉树节点结构做任何附加的要求或改动,也不需要记录平衡因子或高度之类的额外信息。
  • 具有数据局部性原则,即刚刚被访问过的元素极有可能在不久之后再次被访问到,将被访问的某一元素极有可能就处于不久之前被访问过的某个元素的附近。在操作中将访问过的节点放置到树根处,以便于下次访问。
  • 具有旋转操作技巧,当某个节点被访问时,会通过旋转使该节点成为树根,使下次访问该节点时能够迅速访问到。

这些特点使得伸展树在某些场景下比AVL树等其他平衡二叉查找树更为适用。

应用场景

伸展树的应用场景主要是在需要频繁进行查找、插入和删除操作的数据集合中。由于伸展树在查找、插入和删除操作中具有较好的时间复杂度性能,因此适用于需要进行大量数据查找和操作的情况。
例如,在数据库系统中,伸展树可以用于实现索引和缓存等功能。在文件系统中,伸展树可以用于实现目录结构和文件查找等功能。此外,伸展树还可以用于操作系统中的进程调度和内存管理等场景。

示例代码

好的,以下是一个Java实现伸展树的示例代码,包括插入、查找和删除节点的功能:


class Node {int key;Node left, right;Node parent;int degree;
}class SplayTree {Node root;// 插入节点public void insert(int key) {root = insert(root, key);root.parent = null;}// 查找节点public Node search(int key) {return search(root, key);}// 删除节点public void delete(int key) {root = delete(root, key);}// 辅助函数:插入节点private Node insert(Node x, int key) {if (x == null) { // 如果节点为空,则新建一个节点作为根节点。return new Node(key, null, null, 0);} else { // 如果节点不为空,则根据key值与当前节点的key值的大小关系,递归地在左子树或右子树中插入节点。int cmp = key - x.key;if (cmp < 0) { // 如果key小于当前节点的key,则在左子树中插入节点。x.left = insert(x.left, key);} else if (cmp > 0) { // 如果key大于当前节点的key,则在右子树中插入节点。x.right = insert(x.right, key);} else { // 如果key等于当前节点的key,则不插入节点,直接返回原节点。return x;}// 插入节点后,需要更新当前节点的度数。update(x);return x;}}// 辅助函数:查找节点private Node search(Node x, int key) {if (x == null || x.key == key) { // 如果节点为空或节点的key值等于要查找的key值,则返回该节点。return x;} else { // 如果节点的key值与要查找的key值的大小关系为小于或大于,则在相应的子树中查找。int cmp = key - x.key;if (cmp < 0) { // 如果key小于当前节点的key,则在左子树中查找。return search(x.left, key);} else { // 如果key大于当前节点的key,则在右子树中查找。return search(x.right, key);}}}// 辅助函数:删除节点,包括三种情况:根节点、叶子节点和有子节点的情况。private Node delete(Node x, int key) {if (x == null) { // 如果要删除的节点为空,则直接返回原树不变。return x;} else if (x.left == null && x.right == null) { // 如果要删除的节点是叶子节点。if (x == root) { // 如果该叶子节点是根节点,则将右子树作为新的根节点。这里将右子树的最左边的叶子节点作为新的根节点。其它情况可类似处理。例如:右子树的最右边的叶子节点作为新的根节点。其它情况可类似处理。例如: } else { // 如果该叶子节点不是根节点,则将它的父节点的相应指针指向它的右子树或左子树。这里将它的父节点的相应指针指向它的右子树的最左边的叶子节点。其它情况可类似处理。例如:将它的父节点的相应指针指向它的左子树的最右边的叶子节点。其它情况可类似处理。例如: } } else if (x.left == null) { // 如果要删除的节点只有左子树。这里将它的左子树作为新的子节点。其它情况可类似处理。例如:else if (x.right == null) { // 如果要删除的节点只有右子树。这里将它的右子树作为新的子节点。其它情况可类似处理。例如: } } else { // 如果要删除的节点既有左子树又有右子树。这里将它的左子树中的最右边的叶子节点作为新的子节点。其它情况可类似处理。例如: } } 
} 
} 
} } } } } } } } } } } } } } } } } } } } } } } } } } } } }

伸展树的旋转

伸展树的旋转操作包括右旋和左旋两种基本操作。

右旋操作时,节点x携带自己的左子节点向右旋转到y位置,y旋转到x的右子树位置,x的右子树被抛弃,此时y右旋后左子树正好空闲,将x的右子树放到y的左子树位置,旋转后将x挂接到y的父节点。如果原来y是其父节点的右子节点,则旋转后x也是其父节点的右子节点,否则是其父节点的左子节点。

左旋操作与右旋操作类似,具体步骤可以参考右旋操作。

拓展

AVL树你需要了解一下

红黑树你需要了解一下

满二叉树你需要了解一下

完全二叉树你需要了解一下

哈夫曼树你需要了解一下

二叉查找(排序)树你需要了解一下

B树你需要了解一下

B+树你需要了解一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机项目(18)——基于51单片机的大棚环境监测系统

1.功能描述 首先使用DS18B20&#xff0c;测量土壤温度&#xff0c;并显示在OLED屏幕左边。然后使用土壤湿度传感器测量土壤湿度&#xff0c;因为这个传感器输出的值是模拟量&#xff0c;所以需要使用AD转换模块。本次使用ADC0832&#xff0c;这是一个8位精度的AD转换模块&#…

MATLAB算法实战应用案例精讲-【路径规划】 图搜索算法

目录 前言 几个高频面试题目 运动规划、路径规划、轨迹规划对比 1. 运动规划 2. 路径规划VS轨迹规划

大数据技术学习笔记(七)—— Zookeeper

目录 1 Zookeeper 概述1.1 Zookeeper 定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 数据结构1.5 应用场景 2 Zookeeper 安装3 客户端命令行操作4 Zookeeper 的 Java 客户端操作4.1 IDEA 环境搭建4.2 初始化 ZooKeeper 客户端4.3 创建子节点4.4 获取子节点4.5 判断Znode是否…

深入理解 Kafka 集群搭建与管理

Apache Kafka 作为分布式流处理平台的核心&#xff0c;其集群搭建与管理是确保高可用性和高性能的关键。本文将深入研究 Kafka 集群的构建、配置、工作原理、节点角色以及一些高级管理策略&#xff0c;以助力读者更深层次地理解和灵活运用 Kafka 集群。 Kafka 集群基础 1 集群…

智能优化算法应用:基于供需算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于供需算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于供需算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.供需算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Flume 安装部署

文章目录 Flume 概述Flume 安装部署官方网址下载安装配置文件启动 Flume 进程启动报错输出文件乱码问题 Flume 概述 Flume&#xff08;Apache Flume&#xff09;是一个开源的分布式日志收集、聚合和传输系统&#xff0c;属于 Apache 软件基金会的项目之一。其主要目标是简化大…

预约系统源码解析:打造智能定制化预约服务的技术奇迹

在当今数字化时代&#xff0c;预约系统的重要性日益凸显&#xff0c;而预约系统源码的开放将为各行业带来更加灵活、智能的预约解决方案。本文将深入探讨预约系统源码的技术内幕&#xff0c;为开发者提供实用的代码示例&#xff0c;助力打造智能定制化的预约服务。 技术栈概览…

【字符串匹配】【KMP算法】Leetcode 28 找出字符串中第一个匹配项的下标☆

【字符串匹配】【KMP算法】Leetcode 28 找出字符串中第一个匹配项的下标 &#xff08;1&#xff09;前缀和后缀&#xff08;2&#xff09;前缀表&#xff08;最长相同的前缀和后缀的长度&#xff09;&#xff08;3&#xff09;匹配过程示意&#xff08;4&#xff09;next数组的…

鸿蒙开发:UIAbility组件与UI的数据同步-使用EventHub进行数据通信【鸿蒙专栏-21】

文章目录 ArkTS应用模型中UIAbility组件与UI的数据同步使用EventHub进行数据通信使用globalThis进行数据同步1. UIAbility和Page之间使用globalThis2. UIAbility和UIAbility之间使用globalThis3. 使用globalThis的注意事项4. 使用globalThis的注意事项同名对象覆盖导致问题的场…

Python----练习:使用面向对象实现报名系统开发

第一步&#xff1a;分析哪些动作是由哪些实体发出的 学生提出报名 学生提供相关资料 学生缴费 机构收费 教师分配教室 班级增加学生信息 于是&#xff0c;在整个过程中&#xff0c;一共有四个实体&#xff1a;学生、机构、教师、班级&#xff01;在现实中的一个具体的实…

Kubernetes+istio部署bookinfo、Online boutique和sock shop

Kubernetesistio部署bookinfo、Online boutique和sock shop 文章目录 Kubernetesistio部署bookinfo、Online boutique和sock shopbookinfoonline-boutiquesock-shop参考 bookinfo # 创建相应的namespace kubectl create ns bookinfo # 切换namespace kubectl config set-conte…

xxl-job(分布式调度任务)

简介 针对分布式任务调度的需求&#xff0c;市场上出现了很多的产品&#xff1a; 1)TBSchedule&#xff1a;淘宝推出的一款非常优秀的高性能分布式调度框架&#xff0c;目前被应用于阿里&#xff0c;京东&#xff0c;支付宝&#xff0c;国美等很多互联网企业的流程调度系统中。…

【深度学习】Adversarial Diffusion Distillation,SDXL-Turbo 一步出图

代码&#xff1a; https://huggingface.co/stabilityai/sdxl-turbo 使用 SDXL-Turbo 是SDXL 1.0的精炼版本&#xff0c;经过实时合成训练。SDXL-Turbo 基于一种称为对抗扩散蒸馏 (ADD) 的新颖训练方法&#xff08;请参阅技术报告&#xff09;&#xff0c;该方法允许在高图像质…

求最大公约数,和最小公倍数的规则

求最大公约数&#xff0c;和最小公倍数的规则&#xff1f; 最大公约数&#xff08;Greatest Common Divisor&#xff0c;简称GCD&#xff09;是指两个或多个整数共有约数中最大的一个。例如&#xff0c;12和18的最大公约数是6&#xff0c;因为12和18同时都能被6整除。 求最大公…

GPT实现开放式世界游戏实践【生化危机】

最近开始研究如何基于GPT构建一个游戏引擎&#xff0c;于是先从简单的文字游戏开始探索。 从最简单的选择机制、故事机制&#xff0c;完善成一个包括天气、事件、技能、属性、伙伴、建造系统的-生化危机版文字游戏-。 我唯一的体验是&#xff1a;AI游戏&#xff0c;大有可为! …

Linux socket编程(9):IO复用之poll和epoll详解

在之前的文章中&#xff0c;我们学习了IO复用模型之select原理及例子&#xff0c;但是select有监听描述符个数的限制&#xff0c;而且select的效率并不高&#xff0c;所以这篇文章就来学习效率更高的poll和Linux特有的epoll方法。 文章目录 1 select/poll/epoll对比2 poll2.1 p…

《小满生活》连续8天收视破2,生活剧怎么拍才好看?

拍生活剧从不失手的导演汪俊回归统治区&#xff0c;新剧《小满生活》以连续8天收视率破2的骄人成绩笑傲国产剧市场。 ​秦昊、蒋欣主演的《小满生活》是“小系列”的第四部作品&#xff0c;聚焦都市中年夫妻为了二胎换新房的社会问题&#xff0c;这次没有和老搭档黄磊合作&…

SCAU:链表创建与插入结点(填空)

链表创建与插入结点&#xff08;填空&#xff09; Time Limit:1000MS Memory Limit:65535K 题型: 填空题 语言: G;GCC;VC 描述 代码实现先创新一个链表&#xff0c;然后显示该链表&#xff0c;之后插入一个结点&#xff0c;再显示插入结点的链表。 请填空&#xff0c;完成…

如何用Python调整视频的播放速度(90)

今天我们继续用Python玩转视频。 还是用Python的第三方库moviepy。 如果你对此文章感兴趣的话&#xff0c;可以看看之前的几篇文章。 都是和视频、moviepy相关的。 相信你会收获满满。 今天要实现什么效果呢&#xff1f; 调整视频的播放速度&#xff0c;比如1.25倍速、1.5…

Day49力扣打卡

打卡记录 需要添加的硬币的最小数量&#xff08;归纳法&#xff09; 链接 按着已经加入的数&#xff0c;以此偏移对应距离&#xff0c;从而得到新的连续数&#xff0c;若是出现断层则计入最小次数中&#xff0c;再以此偏移对应距离。 class Solution:def minimumAddedCoins(s…