首页 > 其他分享 >CS61B 二叉搜索树的改进:B 树 笔记

CS61B 二叉搜索树的改进:B 树 笔记

时间:2024-11-25 17:30:14浏览次数:7  
标签:删除 BST 复杂度 CS61B 笔记 二叉 logN Theta 节点

CS61B 二叉搜索树的改进:B 树 笔记


笔记的来源:CS 61B-2024 春季的课程
课程主要内容:数据结构与算法分析
课程运用语言:Java

你可以在我的笔记网站里获得更多有用的资源。

这个课有6 个 Homework,10 个 Lab,9 个 Project。其中第一个 project 是一个完整的 2024 游戏的实现,很有意思。此文章对应的是课程 17 节的内容。主要讲述 BST(二叉搜索树)的复杂度

此笔记对应资源:CS 61B 课本资源

1. BST 性能分析

对于 BST 一个缺点是:他的复杂度有可能从 O(logn) 变成 O(n)。
在这里插入图片描述

从中 我们可以回顾一下大 O 和大 Theta 的差别在哪。
对于二叉搜索树,

  1. 最差的情况,树的高度为 Θ ( n ) \Theta(n) Θ(n)
  2. BST 的高度为 O ( n ) O(n) O(n)
  3. BST 的高度为 O ( n 2 ) O(n^2) O(n2)

这些表述都是对的,因为 O 表示的是一个上限。
那为什么需要 O 呢,这里就需要用了,因为情况有可能从 Θ ( N ) \Theta(N) Θ(N)变成 Θ ( l o g N ) \Theta(logN) Θ(logN),所以用 O 表示会合理一些。

2. 介绍 B 树

B 树是一种对 BST 的改进,它是一种平衡的多叉树。它可以解决 BST 的复杂度变成 Θ ( N ) \Theta(N) Θ(N)的问题

2.1 BST 的高度和深度

BST 的高度和深度的计算方法是不同的。
在这里插入图片描述

  • 高度:树的高度是指从根节点到最远叶子节点的最长路径上的节点数。为树范围的属性
  • 深度:树的深度是指根节点到最近叶子节点的路径上的节点数。

树的平均深度是每个节点深度的平均值。

2.2 B 树的插入

比较主要的是 B 树对于节点插入的处理。我们接下来看看一系列插入流程以理解 B 树的插入方法。

在这里插入图片描述

  1. 我们在加入节点的时候首先考虑的是和并进原有节点当中。但如果超过了两个元素在一个节点里,我们就需要做出改变了,如下:

在这里插入图片描述

  1. 我们选择将第二个加入的节点上移,然后分开这个节点。接着我们重复这个操作。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 接下来就产生问题了,如果我们再次上移节点,父节点也会超过两个元素,所以我们需要继续分裂父节点。我们的操作是将父节点分裂成两个节点,然后将第二个节点上移,分裂父节点,如此往复。

在这里插入图片描述

这就是 B 树的假如节点操作,可以尽可能的将复杂度控制在 Θ ( l o g N ) \Theta(logN) Θ(logN)。因为他在平均分配节点,使得平均深度尽可能的小。这里的节点中元素个数是可以改变的,这里控制的是两个元素的节点。可以被称之为 2-3 树。

B 树的特性之一便是任何一个末端子节点到父节点的距离是一样的,这使得 B 树的高度和深度都可以被控制在 Θ ( l o g N ) \Theta(logN) Θ(logN)。这玩意是 1972 年被发明的。整个算法的核心在于平衡,即不断从父节点去控制子节点的平衡性。

2.3 B 树的删除

B 树的删除操作也比较复杂。我们先来看看删除节点的流程。

如果我们要删除的节点有两个以上的子节点,我们需要将它和一个继承者交换,然后再删除它,这个继承者必须是末端的子节点。如下图中,我们要删除 17,则先将 18 交换到 17,然后删除 17。

在这里插入图片描述

其次要考虑的问题就是,我们这里是 2-3 树,但有可能会用到节点容量更大的树,比如说这个:
在这里插入图片描述

我们想要删除 27,那么先讲 27 和 28 交换,再删除 27,结果是这样的:
在这里插入图片描述

这样导致 29 的那个几点钟直邮一个元素,很浪费空间,所以我们将 29 和其他子节点进行平衡:
在这里插入图片描述

这就是 B 树的删除操作

总结

B 树是一种对 BST 的改进,它是一种平衡的多叉树。它可以解决 BST 的复杂度变成 Θ ( N ) \Theta(N) Θ(N)的问题。B 树的插入和删除操作都可以被控制在 Θ ( l o g N ) \Theta(logN) Θ(logN)。

标签:删除,BST,复杂度,CS61B,笔记,二叉,logN,Theta,节点
From: https://blog.csdn.net/qq_55297504/article/details/144032582

相关文章

  • Vue3.0 实操学习笔记
    安装 node.js安装 https://nodejs.org/en安装后执行node-v查看是否有异常以及npm-v查看是否异常调整为淘宝镜像,cnpm-v查看是否异常npminstall-gcnpm--registry=https://registry.npm.taobao.orgVue安装以及安装脚手架 vue-V查看是否异常cnpmi-......
  • [豪の学习笔记] 操作系统#001
    1.1.1-操作系统的概念、功能操作系统(OperatingSystem,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。①操作系统是系统资源的管理者提供的功能:处理......
  • WPF笔记3——x:Name 与 Name
    在WPF中,给Button控件的x:Name和Name属性都可以用来指定控件的名称,如下:点击查看代码<Buttonx:Name="button1">click1</Button><ButtonName="button2">click2</Button>虽然它们在功能上是等价的。但是,它们之间是有差异的。x:Name这个属性是XAML命名......
  • java反射笔记
    packagetest1125;publicclassclassTest{publicstaticvoidmain(String[]args){try{//获取Class对象的三种方式System.out.println("根据类名:\t"+User.class);System.out.println("根据对象:\t"......
  • WPF笔记2——路由事件
    WPF的路由事件(RoutedEvents),允许事件在UI元素层次结构中传播。在WPF中,UI元素被组织成一棵树,成为可视化树(VisualTree)。当一个事件(如鼠标点击)在某个控件上触发时,这个事件可以沿着VisualTree向上(向树的根部)或向下(向树的枝叶)传播;如果不广播就是直接事件。路由事件有两个主要的传......
  • WPF笔记1
    WPF是一个与分辨率无关的UI框架,使用基于矢量的呈现引擎,构建用于利用现代图形硬件。1、用vs2022创建一个WPF项目2、打开解决方案资源管理器可以看到VS帮我们创建了下面这些文件:MainWindow.xaml文件是使用xaml标记实现的程序的界面外观,通常是设计人员来编辑;MainWindow.xaml.cs......
  • 【MySQL实战45讲笔记】基础篇—— 全局锁和表锁
    系列文章基础篇——MySQL的基础架构基础篇——redolog和binlog基础篇——事务隔离基础篇——深入浅出索引(上)基础篇——深入浅出索引(下)目录系列文章6.1全局锁6.1.1server级和存储引擎级的全局锁6.1.2FTWRLVSreadonly6.2表级锁6.2.1表锁6.2.2MDL元数据......
  • 98.验证二叉搜索树 Golang实现「自顶向下」
    题目描述:给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。输入:root=[5,1,4,null,null,3,6]输出:fa......
  • 617. 合并二叉树 Golang实现
    题目描述:给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为null的节点将直接作......
  • QinQ 笔记
    QinQ笔记QinQ技术是在4096个vlan不够使用的情况下非常符合直觉的解决方案,通过多层802.1QTag扩展vlan;实现起来也简单,甚至可以和不支持QinQ功能的网络设备对接,同时不影响数据的转发。企业网络中单个园区4096个vlan大多数情况是够用的,但是如果是涉及到多园区互联或者......