伸展树(Splay Tree)

简介: 伸展树(Splay Tree),也叫分裂树或摊平树,是一种自平衡的二叉查找树。它在插入、删除、查找等操作中,通过伸展(Splay)操作保持树的平衡,使得树的高度始终保持在 O(log n)。它具有较高的查找、插入、删除等操作的性能,因此被广泛应用于计算机科学中。伸展树的操作包括:插入、删除、查找、最大值、最小值等。下面是一个简单的伸展树操作过程:

伸展树(Splay Tree),也叫分裂树或摊平树,是一种自平衡的二叉查找树。它在插入、删除、查找等操作中,通过伸展(Splay)操作保持树的平衡,使得树的高度始终保持在 O(log n)。它具有较高的查找、插入、删除等操作的性能,因此被广泛应用于计算机科学中。
伸展树的操作包括:插入、删除、查找、最大值、最小值等。下面是一个简单的伸展树操作过程:

  1. 插入:在伸展树中插入一个新节点,首先将节点插入到普通二叉查找树的适当位置。然后,通过旋转和重新伸展操作,使得树重新恢复平衡。
  2. 删除:在伸展树中删除一个节点,首先在普通二叉查找树中删除节点。然后,通过旋转和重新伸展操作,使得树重新恢复平衡。
  3. 查找:在伸展树中查找一个节点,通过普通二叉查找树进行查找。由于伸展树的高度始终保持在 O(log n),因此查找的时间复杂度为 O(log n)。
  4. 最大值和最小值:在伸展树中获取最大值和最小值,通过遍历树的最左和最右子树得到。
    在实际应用中,伸展树主要用于以下场景:
  5. 频繁进行插入、删除、查找等操作的数据结构。
  6. 需要保持数据有序的数据结构。
  7. 需要快速找到最大值或最小值的数据结构。
    推荐一个使用 Python 实现的伸展树(Splay Tree)的 Demo:

class SplayTreeNode:
def init(self, key):
self.key = key
self.left = None
self.right = None
self.parent = None
class SplayTree:
def init(self):
self.root = None
def insert(self, key):
if not self.root:
self.root = SplayTreeNode(key)
else:
self.root = self._insert(self.root, key)
def _insert(self, node, key):
if not node:
return SplayTreeNode(key)
if key < node.key:
node.left = self._insert(node.left, key)
else:
node.right = self._insert(node.right, key)
node.parent = None
return self._splay(node)
def delete(self, key):
if self.root:
self.root = self._delete(self.root, key)
def _delete(self, node, key):
if not node:
return node
if key < node.key:
node.left = self._delete(node.left, key)
elif key > node.key:
node.right = self._delete(node.right, key)
else:
if not node.left:
return node.right
elif not node.right:
return node.left
else:
temp = self._find_min(node.right)
node.key = temp.key
node.right = self._delete(node.right, temp.key)
return self._splay(node)
def _find_min(self, node):
while node.left:
node = node.left
return node
def _splay(self, node):
if node.parent:
if node.parent.left == node:
node.parent.left = self._splay(node.right)
else:
node.parent.right = self._splay(node.right)
node.parent = None
return node
def search(self, key):
return self._search(self.root, key)
def _search(self, node, key):
if not node or node.key == key:
return node
if key < node.key:
return self._search(node.left, key)
else:
return self._search(node.right, key)
def min_value_node(self):
return self._min_value_node(self.root)
def _min_value_node(self, node):
while node.left:
node

目录
相关文章
|
机器学习/深度学习 人工智能 算法
基于机器视觉的害虫种类及计数检测研究-人工智能项目-附代码
基于机器视觉的害虫种类及计数检测研究-人工智能项目-附代码
|
Kubernetes 安全 API
Kubernetes 多租户实践
Kubernetes 多租户实践
464 0
|
4月前
|
数据采集 监控 数据管理
数据管理最容易混淆的3个概念:元数据、数据元、元模型
本文深入解析数据领域三大核心概念:“元数据”“数据元”“元模型”,从定义、用途到实际应用,清晰区分三者区别。元数据是“数据的说明书”,描述数据来源与使用方式;数据元是“最小数据单元”的标准,确保数据统一与规范;元模型是“模型的设计规则”,指导模型合理构建。三者相辅相成,是数据治理不可或缺的基础。掌握它们,助你提升数据管理效率,避免踩坑。
|
JavaScript Java 测试技术
基于SpringBoot+Vue的大学生兼职平台的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的大学生兼职平台的详细设计和实现(源码+lw+部署文档+讲解等)
264 3
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
1622 3
WK
|
机器学习/深度学习 算法 PyTorch
如何计算损失函数关于参数的梯度
计算损失函数关于参数的梯度是深度学习优化的关键,涉及前向传播、损失计算、反向传播及参数更新等多个步骤。首先,输入数据经由模型各层前向传播生成预测结果;其次,利用损失函数评估预测与实际标签间的差距;再次,采用反向传播算法自输出层逐层向前计算梯度;过程中需考虑激活函数、输入数据及相邻层梯度影响。针对不同层类型,如线性层或非线性层(ReLU、Sigmoid),梯度计算方式各异。最终,借助梯度下降法或其他优化算法更新模型参数,直至满足特定停止条件。实际应用中还需解决梯度消失与爆炸问题,确保模型稳定训练。
WK
582 0
|
监控 数据可视化 数据挖掘
软考高项八大绩效域及论文纲要
软考高项八大绩效域及论文纲要
422 2
|
编解码
笔记本的常见分辨率
笔记本的常见分辨率
|
存储 算法 C++
【C++ map结构 】std::map 和 std::unordered_map 在使用上的差异
【C++ map结构 】std::map 和 std::unordered_map 在使用上的差异
544 0