【Algorithms 4】算法(第4版)学习笔记 09 - 3.2 二叉查找树

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1:二叉树与二叉搜索树定义
      • 1.1:二叉树定义
      • 1.2:二叉搜索树定义
      • 1.3:Java定义
      • 1.4:BST基本实现
      • 1.5:BST demo 演示
      • 1.5.1:节点搜索成功命中演示
      • 1.5.2:节点搜索未命中演示
      • 1.5.3:节点插入演示
      • 1.6:BST 查找:Java 实现
      • 1.7:BST 插入:Java 实现
      • 1.8:树的形状
      • 1.9:BSTs 与快速排序分区的一致性
      • 1.10:小结
      • 2:排序操作
      • 2.1:向上取整与向下取整
      • 2.1.1:向下取整过程演示
      • 2.1.2:向下取整代码实现
      • 2.2:小结
      • 3:删除操作
      • 3.1:删除最大键和删除最小键
      • 3.1.1:删除最小项过程演示
      • 3.1.2:删除最小项代码实现
      • 3.2:删除操作
      • 3.2.1:Hibbard 删除
      • 3.2.2:Hibbard 删除代码实现
      • 3.3:删除操作分析
      • 3.4:小结

前言

本文的主要内容是 二叉搜索树 (binary search trees,以下简称 BST)以及其相关的 API 操作介绍。

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《3.2 二叉查找树》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。

1:二叉树与二叉搜索树定义

定义:BST是对称顺序的二叉树。

1.1:二叉树定义

二叉树要么为空, 要么由两个不相交的二叉树组成(即左子树和右子树)。

进一步理解(有点绕):

  • 一个二叉树可以是一个空树(null)。
  • 否则,它是一个包含一个根节点的树,该节点连接到两个独立的二叉树上,分别称为其左子树和右子树,且左子树和右子树也是二叉树结构。

在这里插入图片描述

二叉树是一种显式数据结构(显式树结构),与之相对应的,堆是一种隐式数据结构(用数组隐式表示树)。

1.2:二叉搜索树定义

对称顺序。每个节点都有一个键(key),并且每个节点的键都满足以下条件:

  • 大于其左子树中所有节点的键。
  • 小于其右子树中所有节点的键。

进一步理解:

  • 对于二叉树中的任意节点,其键值严格大于其左子树中所有节点的键值。
  • 同时,该节点的键值严格小于其右子树中所有节点的键值。

在这里插入图片描述

1.3:Java定义

一个二叉搜索树(BST)是一个指向根节点的引用。

一个节点由四个部分组成:

  • 一个键(Key)和一个对应的值(Value)。
  • 分别指向其左子树(更小的 key)和右子树(更大的 key)的引用。

在这里插入图片描述

1.4:BST基本实现

edu.princeton.cs.algs4.BST

在这里插入图片描述

在这里插入图片描述

1.5:BST demo 演示

查找:如果更小,向左移动;如果更大,向右移动;如果相等,搜索命中。

1.5.1:节点搜索成功命中演示

搜索 H:

初始状态:

在这里插入图片描述

与根节点 S 比较(更小),左移:

在这里插入图片描述


在这里插入图片描述

与节点 S 左子树节点 E 比较(更大),右移:

在这里插入图片描述


在这里插入图片描述

与节点 E 右子树节点 R 比较(更小),左移:

在这里插入图片描述


在这里插入图片描述

与节点 R 左子树节点 H 比较(相等),搜索命中:

在这里插入图片描述

1.5.2:节点搜索未命中演示

搜索 G:

初始状态:

在这里插入图片描述

与根节点 S 比较(更小),左移:

在这里插入图片描述

与节点 S 左子树节点 E 比较(更大),右移:

在这里插入图片描述

与节点 E 右子树节点 R 比较(更小),左移:

在这里插入图片描述

与节点 R 左子树节点 H 比较(更小),左移:

在这里插入图片描述

H 左移为空链接,查找未命中(并返回 null):

在这里插入图片描述

1.5.3:节点插入演示

插入:如果更小,向左移动;如果更大,向右移动;如果为 null,插入。

插入 G:

初始状态:

在这里插入图片描述

移动路径与 #1.5.2 查找类似,直到节点 H 左子树为 null,插入节点 G:

在这里插入图片描述


在这里插入图片描述

G 完整移动路线图:

在这里插入图片描述

1.6:BST 查找:Java 实现

edu.princeton.cs.algs4.BST#get

在这里插入图片描述

开销:

一次结束于给定结点的命中查找所需的比较次数为查找路径的深度加1。

1.7:BST 插入:Java 实现

edu.princeton.cs.algs4.BST#put

在这里插入图片描述

在这里插入图片描述

1.8:树的形状

  • 许多 BSTs 对应同一组keys
  • 一次查找 / 插入所需的比较次数为查找路径的深度加1。

在这里插入图片描述

注:树的形状取决于键被插入的先后顺序。

1.9:BSTs 与快速排序分区的一致性

在这里插入图片描述

命题C。在由N个随机键构造的二叉查找树中,查找命中平均所需的比较次数为~2lnN(约1.39lgN)。

命题D。在由N个随机键构造的二叉查找树中插入操作和查找未命中平均所需的比较次数为~2lnN(约1.39lgN)。

在这里插入图片描述

参考 快速排序:1.4.3:平均案例分析。

1.10:小结

在这里插入图片描述

书里面在章节末尾也有给出相关的表格:

表3.2.2 简单的符号表实现的成本总结
在这里插入图片描述

2:排序操作

Now,we’re going to take a look at ordered symbol table operations using the binary search tree data structure as the underlying implementation.
现在,我们将要探讨如何利用二叉搜索树这一数据结构作为底层实现,来进行有序符号表操作。

相关的所有章节:

  • 3.2.3.1 最大键和最小键 Minimum and maximum.
  • 3.2.3.2 向上取整和向下取整 Floor and ceiling.
  • 3.2.3.3 选择操作 Selection.
  • 3.2.3.4 排名 Rank.

2.1:向上取整与向下取整

2.1.1:向下取整过程演示

在这里插入图片描述
图3.2.10 计算floor()函数

2.1.2:向下取整代码实现

edu.princeton.cs.algs4.BST#floor

在这里插入图片描述

2.2:小结

在这里插入图片描述

3:删除操作

相关的所有章节:

  • 3.2.3.5 删除最大键和删除最小键 Delete the minimum and maximum.
  • 3.2.3.6 删除操作 Delete.
  • 3.2.3.7 范围查找 Range search.
  • 3.2.3.8 性能分析

3.1:删除最大键和删除最小键

3.1.1:删除最小项过程演示

  • 向左移动,直到找到左链接为空的节点。
  • 将该节点替换为其右侧链接。
  • 更新子树计数。

在这里插入图片描述
图3.2.12 删除二叉查找树中的最小结点

3.1.2:删除最小项代码实现

edu.princeton.cs.algs4.BST#deleteMin

在这里插入图片描述

3.2:删除操作

3.2.1:Hibbard 删除

情况一:没有子节点

在这里插入图片描述

情况二:一个子节点

在这里插入图片描述

情况三:两个子节点

在这里插入图片描述

书中关于删除过程操作的描述:

在这里插入图片描述
图3.2.13 二叉查找树中的删除操作

在这里插入图片描述

3.2.2:Hibbard 删除代码实现

edu.princeton.cs.algs4.BST#delete

在这里插入图片描述

在这里插入图片描述

3.3:删除操作分析

在这里插入图片描述

简单汉化一下:

不能令人满意的结果:不对称。
令人惊讶的事实:树不再随机 => 平方操作
长期存在的开放问题:简单高效的 BST 删除。

That’s another one like merging in place, that you’d think there ought to be an easy way to do it, but in 50 years, no one’s really discovered one.
这是另一种类似原地归并的方法,你会认为应该有一种简单的方法可以做到这一点,但 50 年来,没有人真正找到解决方法。

3.4:小结

在这里插入图片描述

下一节:红黑二叉搜索树(Red-black BST):保证所有操作的对数性能。

But the delete operation for Binary Search Trees shows us the kind of complexity that we can encounter with working with these kinds of data structures.
BST 删除操作向我们展示了当遇到类似数据结构时我们可能遇到的复杂情况。

(完)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ElementUI table表格组件实现双击编辑单元格失去焦点还原,支持多单元格

在使用ElementUI table表格组件时有时需要双击单元格显示编辑状态,失去焦点时还原表格显示。 实现思路: 在数据中增加isFocus:false.控制是否显示在table中用cell-dblclick双击方法 先看效果: 上源码:在表格模板中用scope.row…

Nginx缓存相关配置解析

文章目录 前言配置示例proxy_cacheproxy_cache_pathproxy_cache_keyproxy_cache_validproxy_cache_lockproxy_cache_methodsproxy_cache_bypassproxy_no_cacheproxy_cache_min_usesadd_header 可选项 使用示例通过响应头判断是否走缓存 缓存手动删除原博客 前言 客户端需要访问…

10、内网安全-横向移动域控提权NetLogonADCSPACKDC永恒之蓝

用途:个人学习笔记,有所借鉴,欢迎指正! 背景: 主要针对内网主机中的 域控提权漏洞,包含漏洞探针和漏洞复现利用。 1、横向移动-系统漏洞-CVE-2017-0146(ms17-010,永恒之蓝&#xff0…

如何添加或编辑自定义WordPress侧边栏

WordPress侧边栏是许多WordPress网站上的固定装置。它为您的内容提供了一个垂直空间,您可以在其中帮助读者导航、增加电子邮件列表或社交关注、展示广告等。 因为它是许多WordPress网站不可或缺的一部分,所以我们认为侧边栏值得拥有自己的大型指南。在这…

SpringBootWeb学习笔记——12万字详细总结!

0. 写在前面 注:这套笔记是根据黑马程序员B站2023-3-21的视频学习的成果,其中省略了前端基础部分、Maven部分和数据库基础部分,详情可见目录。 注注:目前文章内结尾处多幅图片加载不出来,因为图片还存在本地没被传上来,过段时间再改~ 所有的Spring项目都基于Spring Fra…

3、windows环境下vscode开发c/c++环境配置(二)

前言:上一篇文章写了windows环境下,配置vscode的c/c开发环境,这一篇讲vscode开发c/c的配置文件,包括c_cpp_propertues.json,task.json及launch.json。 一、总体流程 通过c/c插件我们就可以来编写c/c程序了&#xff0c…

网贷大数据查询多了对征信有影响吗?

网贷大数据在日常的金融借贷中起到很重要的风控作用,不少银行已经将大数据检测作为重要的风控环节。很多人在申贷之前都会提前了解自己的大数据信用情况,那网贷大数据查询多了对征信有影响吗?本文带你一起去看看。 首先要说结论:那就是查询网…

面试经典150题——同构字符串

"Dream big and dare to fail." - Norman Vaughan 1. 题目描述 2. 题目分析与解析 2.1 思路一 看见这个题目的第一反应就是使用一个hash表,用来存储映射关系,具体思路如下: 首先二者要是同构的长度肯定是得相同的,但…

Android 多线程并发优化实现

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、Thread 使用二、Android Thread三.线程优先级 一、Thread 使用 在讲解多线程之前,我们先来讲解Thread使用几个需要注意的点&#xff1a…

Unity UGUI的DrawCall优化

Unity UGUI是一种强大的用户界面设计工具,它可以帮助开发者快速创建各种界面元素,从按钮和文本到滑块和面板等。然而,在使用UGUI时,一个常见的性能瓶颈就是DrawCall过多导致的性能下降。在本文中,我们将深入探讨UGUI的…

集成使用 GitHub Copilot 提升 IDEA 开发效率

集成使用 GitHub Copilot 提升 IDEA 开发效率 在现代软件开发中,集成开发环境(IDE)如IntelliJ IDEA已经成为开发人员不可或缺的工具。它们提供了代码编辑、调试、版本控制等一系列功能,极大地提高了开发效率。而GitHub Copilot作…

C# Winfrom实例:武汉智能安检闸机数据接收和解析

项目介绍:本实例主要是接收安检闸机的数据解析并显示到界面上,只做功能实现,不做界面美化 硬件:闸机一个、网线一根、电脑主机开发环境:vs2017 系统:win10涵盖知识点:tcp通讯、文件写入、多线程…

《软件方法(下)》8.2.5.2 属性是否直接描述类(202402更新)(2)

导致出现违反本要点的错误的原因有: (1)缺少抽象能力 缺少抽象能力的建模人员经常会把手上素材的信息,一一对应地映射为类和属性,导致本来属于多个类的信息被合并在一个类中。 如图8-63,建模人员对照着一…

ETL、ELT区别以及如何正确运用

一、 浅谈ETL、ELT ETL与ELT的概念 ETL (Extract, Transform, Load) 是一种数据集成过程,通常用于将数据从一个或多个源系统抽取出来,经过清洗、转换等处理后,加载到目标数据存储中。这种方法适用于需要对数据进行加工和整合后再加载到目标…

Django学习笔记-HTML实现MySQL的图片上传

1.django项目编写index.html代码 创建form表单,路由指向upload,请求方式post,enctype设置"multipart/form-data", post请求添加{% csrf_token %},编写两个input,上传和提交 2.添加upload路由 3.views中创建upload 1).获取上传的文件,没有上传则返回"没有指定…

打码半年,开源一款自定义大屏设计软件!

hi,大家好,我是Tduck马马。 最近我们开源了一款大屏软件-TReport,与大家分享。 TReport是一款基于Vue3技术栈的数据可视化系统,支持静态、动态api等数据源;可用于数据可视化分析、报表分析、海报设计使用。 提供自定…

Stable Diffusion 绘画入门教程(webui)-图生图

通过之前的文章相信大家对文生图已经不陌生了,那么图生图是干啥的呢? 简单理解就是根据我们给出的图片做为参考进行生成图片。 一、能干啥 这里举两个例子 1、二次元头像 真人转二次元,或者二次元转真人都行, 下图为真人转二次…

.net6 webapi log4net完整配置使用流程

前置&#xff1a;为项目安装如下两个依赖 1.创建文件夹cfgFile 2.创建log4net.Config <?xml version"1.0" encoding"utf-8" ?> <log4net><appender name"ConsoleAppender" type"log4net.Appender.ConsoleAppender"…

使用备份工具xtrabackup进行差异备份详细讲解

差异备份 基于第一天进行差异备份 删除之前修改的数据备份 [rootservice ~]# rm -rf /data/backup/* [rootservice ~]# ls /data/backup 完整备份 [rootservice ~]# xtrabackup --defaults-file/etc/my.cnf --backup --target-dir/data/backup/base/ -uroot -pWyxbuke00. -H…

Collection集合体系(ArrayList,LinekdList,HashSet,LinkedHashSet,TreeSet,Collections)

目录 一.Collection 二.List集合 三.ArrayList集合 四.LinkedList集合 五.Set集合 六.hashSet集合 七.LinkedHashSet集合 八.TreeSet集合 九.集合工具类Collections 集合体系概述 单列集合&#xff1a;Collection代表单列集合&#xff0c;每个元素&#…