B树与B+树的奥秘:原理解析与性能

引言

B树和B+树是计算机科学中两个重要的数据结构,它们在数据库和文件系统中扮演着至关重要的角色。在处理大量数据时,高效的数据组织和检索方式是至关重要的,而B树和B+树正是为此而设计的。

B树和B+树都是多路查找树的变体,它们通过将多个键值存储在一个节点中,有效地减少了磁盘I/O访问次数,从而提高了数据检索的效率。这种优化对于处理大型数据库和文件系统特别重要,因为它们可以大大减少磁盘访问次数,提高了数据的读取和写入速度。

在本文中,我们将深入探讨B树和B+树的原理、操作以及它们之间的区别。首先,我们将介绍树结构的基础概念,包括二叉树、平衡树和多路查找树。然后,我们将详细讨论B树和B+树的定义、性质和节点结构,以及它们的构建过程、查找过程和删除过程。

接着,我们将比较B树和B+树在结构上的差异和性能上的差异,包括查找效率、插入和删除效率、磁盘读写性能以及范围查询的性能。我们还将探讨B树和B+树在不同场景下的适用性,并提供选择索引结构的依据。

通过分析一些著名数据库系统中B树和B+树的实际应用案例,我们将进一步理解它们在现实世界中的应用和优劣势。最后,我们将总结B树和B+树的主要特点,强调它们在现代计算机系统中的重要性,并指出它们的优缺点。

本文将帮助读者深入了解B树和B+树的奥秘,以及它们在数据库和文件系统中的应用。通过清晰的解释和丰富的内容,读者将能够更好地理解这两种重要的数据结构,并在实际应用中做出更明智的选择。

基础概念

树结构简介

二叉树

二叉树是一种常见的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。这种结构方便了对数据的快速查找和排序操作。

平衡树

平衡树是一种特殊的二叉树,它的左右子树的高度差不超过1。通过保持树的平衡,平衡树能够确保在最坏情况下的查找效率仍然很高,避免了出现退化为链表的情况。

多路查找树

多路查找树是指每个节点可以包含多个子节点的树结构。相比于二叉树,多路查找树能够在每个节点存储更多的数据,提高了存储和检索的效率。

B树定义

B树的概念

B树是一种多路平衡查找树,它的每个节点可以含有多个子节点,且每个节点中的数据按顺序排列。B树通常应用于文件系统和数据库中,能够有效地支持范围查找和大数据量的存储。

B树的性质
  • 所有叶子节点位于同一层级。
  • 每个节点包含的关键字数量有上下界限。
  • 根节点至少包含一个关键字。
  • 非叶子节点的关键字按非降序排列。
B树的节点结构

B树的节点包含两种类型:内部节点和叶子节点。内部节点存储关键字和子节点指针,而叶子节点存储关键字和相关数据。

B+树定义

B+树的概念

B+树也是一种多路平衡查找树,与B树相比,B+树的叶子节点形成了一个有序链表,能够更快地支持范围查找操作。

B+树的性质
  • 所有叶子节点通过指针连接成一个有序链表。
  • 非叶子节点只存储索引,不存储数据。
  • 叶子节点存储了全部数据,并且按顺序排列。
B+树的节点结构

B+树的节点结构与B树类似,但是在B+树中,叶子节点包含了全部数据,而内部节点仅包含索引。

这些基础概念是理解B树与B+树的重要前提,后续我们将深入探讨它们的构建过程、查找过程、删除过程以及在不同场景下的应用和性能比较。

B树的原理与操作

构建过程

节点分裂

B树的构建过程中,当一个节点已满时,需要进行节点分裂操作。节点分裂的基本思想是将一个节点中的关键字按中值分成两部分,并将中值提升到父节点中。这样可以保持B树的平衡性质。

节点分裂的具体步骤如下:

  1. 找到满节点中的中值。
  2. 将中值提升到父节点,并创建一个新的节点作为原节点的兄弟节点。
  3. 将原节点中较小的一部分关键字移动到新节点中,并更新节点的指针。

节点分裂操作的目的是保持B树的平衡,确保每个节点的关键字数量在一个合理的范围内,同时保持树的高度平衡。

键值插入

在B树中插入新的键值时,需要遵循以下步骤:

  1. 从根节点开始,按照关键字的大小顺序逐级向下查找合适的位置。
  2. 如果目标节点未满,则直接将键值插入到该节点中,并保持节点的关键字有序。
  3. 如果目标节点已满,则进行节点分裂操作,然后继续插入。

键值插入操作保证了B树的平衡性和有序性,使得数据的插入操作具有较好的性能。

查找过程

查找算法描述

B树的查找算法类似于二叉查找树,但由于B树的节点含有多个关键字,因此查找过程稍微复杂一些。查找算法描述如下:

  1. 从根节点开始,比较目标值与节点中的关键字,选择合适的子节点继续查找。
  2. 如果目标值小于当前节点中的最小关键字,则向左子节点查找;如果目标值大于当前节点中的最大关键字,则向右子节点查找。
  3. 重复以上步骤,直到找到目标值或者到达叶子节点为止。

B树的查找算法保证了在平衡树结构中高效地查找目标值,时间复杂度为O(log n)。

删除过程

节点合并

B树的删除操作可能导致节点的关键字数量低于最小要求,需要进行节点合并操作以保持树的平衡。节点合并的基本思想是将两个相邻节点合并成一个节点,并从父节点中删除相应的关键字。

节点合并的具体步骤如下:

  1. 找到待合并的两个相邻节点和它们的父节点。
  2. 将父节点中的一个关键字下移至合并后的节点中。
  3. 将另一个节点中的所有关键字移动至合并后的节点中。
  4. 更新父节点的指针,删除一个子节点指针。

节点合并操作的目的是减少树的高度,保持B树的平衡性质,同时避免了节点数量过多的情况。

键值删除

B树的键值删除操作涉及节点的合并和关键字的移动,具体步骤如下:

  1. 找到待删除的关键字所在的节点。
  2. 如果目标节点是叶子节点,则直接删除关键字。
  3. 如果目标节点是内部节点,则选择一个合适的后继关键字替换被删除的关键字,然后递归删除后继关键字。

键值删除操作保证了B树的平衡性和有序性,使得数据的删除操作也具有较好的性能。

这些原理和操作使得B树成为了一种在数据库和文件系统中广泛应用的高效数据结构。

B+树的原理与操作

构建过程

节点分裂

B+树的构建过程中,与B树相似,当一个节点已满时,也需要进行节点分裂操作。节点分裂的目的是保持B+树的平衡性和有序性,同时利用B+树叶子节点的链表结构提高范围查询的效率。

节点分裂的步骤如下:

  1. 找到满节点中的中值。
  2. 将中值提升到父节点中,并创建一个新的节点作为原节点的兄弟节点。
  3. 将原节点中较大的一部分关键字和相关数据移动到新节点中。
  4. 更新父节点中的指针,确保指向正确的子节点。

B+树的节点分裂操作保证了树的平衡性和有序性,同时维护了叶子节点的链表结构。

键值插入

B+树的键值插入操作与B树类似,但有一点不同的是,新插入的键值总是被插入到叶子节点中,而不会出现内部节点中的情况。插入操作的具体步骤包括:

  1. 从根节点开始,按照关键字的大小顺序逐级向下查找合适的叶子节点。
  2. 如果目标叶子节点未满,则直接将键值插入到该节点中,并保持节点的关键字有序。
  3. 如果目标叶子节点已满,则进行节点分裂操作,然后继续插入。

键值插入操作保证了B+树的平衡性和有序性,同时利用了叶子节点的链表结构提高了范围查询的效率。

查找过程

查找算法描述

B+树的查找算法与B树类似,但是在B+树中,所有的数据都存储在叶子节点中,并且叶子节点通过指针连接成一个有序链表。查找过程如下:

  1. 从根节点开始,比较目标值与节点中的关键字,选择合适的子节点继续查找。
  2. 如果目标值小于当前节点中的最小关键字,则向左子节点查找;如果目标值大于当前节点中的最大关键字,则向右子节点查找。
  3. 重复以上步骤,直到找到目标值或者到达叶子节点为止。
  4. 如果到达叶子节点,则在叶子节点的链表中顺序查找目标值。

B+树的查找算法保证了在平衡树结构中高效地查找目标值,同时通过链表结构提高了范围查询的效率。

删除过程

节点合并

B+树的删除操作可能导致节点的关键字数量低于最小要求,需要进行节点合并操作以保持树的平衡。节点合并的步骤与B树相似,具体操作如下:

  1. 找到待合并的两个相邻节点和它们的父节点。
  2. 将父节点中的一个关键字下移至合并后的节点中。
  3. 将另一个节点中的所有关键字移动至合并后的节点中。
  4. 更新父节点的指针,删除一个子节点指针。

节点合并操作保持了B+树的平衡性和有序性,同时通过合并叶子节点的链表提高了范围查询的效率。

键值删除

B+树的键值删除操作涉及节点的合并和关键字的移动,具体步骤与B树相似,但只需删除叶子节点中的目标关键字即可。

键值删除操作保证了B+树的平衡性和有序性,同时维护了叶子节点的链表结构,使得删除操作具有较好的性能。

B+树通过节点分裂、键值插入、查找和删除等操作,以及叶子节点的链表结构,实现了高效的数据存储和检索功能。

B树与B+树的区别

结构上的差异

节点存储
  1. B树

    • B树的每个节点既存储关键字,又存储对应的数据。
    • 内部节点和叶子节点的结构相同,都可以存储数据。
    • B树的节点通常更大,因为每个节点需要存储数据,这可能导致更多的磁盘I/O操作。
  2. B+树

    • B+树的内部节点只存储关键字,不存储数据,只有叶子节点存储数据。
    • 内部节点和叶子节点的结构不同,内部节点只存储索引。
    • B+树的内部节点通常更小,因为不需要存储数据,这减少了磁盘I/O操作的次数。
键值分布
  1. B树

    • B树的每个节点包含了一部分关键字和对应的数据,且按照大小顺序存储。
    • 可以直接通过内部节点查找到对应的数据,而不需要在叶子节点中进行额外的查找操作。
  2. B+树

    • B+树的内部节点仅包含了关键字,不包含数据,数据全部存储在叶子节点中。
    • 内部节点的关键字范围与其子节点的范围完全对应,而叶子节点通过链表连接,使得范围查询更高效。

性能比较

查找效率
  1. B树

    • 由于B树的节点中包含了部分数据,因此在查找过程中可以直接访问内部节点,减少了查找路径的长度,提高了查找效率。
  2. B+树

    • B+树的内部节点仅包含了索引,查找过程需要沿着内部节点一直查找到叶子节点才能找到数据,因此在查找过程中可能需要更多的磁盘I/O操作。
插入和删除效率
  1. B树

    • 插入和删除操作可能需要更新内部节点和叶子节点,但由于数据存储在内部节点中,所以这些操作相对较快。
  2. B+树

    • 插入和删除操作只需要更新内部节点和叶子节点的关键字索引,因此这些操作通常更快,尤其是在大规模数据插入和删除时。
磁盘读写性能
  1. B树

    • 由于B树的节点包含了数据,因此可能需要更多的磁盘I/O操作来读取或写入节点数据,导致性能略低于B+树。
  2. B+树

    • B+树的内部节点只存储索引,叶子节点通过链表连接,减少了磁盘I/O操作的次数,因此具有更好的磁盘读写性能。
范围查询
  1. B树

    • B树在进行范围查询时可能需要遍历多个节点来获取满足条件的数据,因为数据分散在各个节点中。
  2. B+树

    • B+树在进行范围查询时只需要在叶子节点的链表上顺序查找,因此范围查询的效率更高。

综上所述,B树和B+树在结构上和性能上存在一些差异,具体的选择取决于应用场景和需求。通常来说,对于大规模数据存储和范围查询频繁的场景,B+树更适合;而对于需要频繁进行插入和删除操作的场景,B树可能更合适。

应用场景

B树的适用场景

  1. 文件系统

    • 在文件系统中,B树常用于索引文件的内容和目录结构,能够快速定位到文件块的位置,提高文件的访问速度。
  2. 数据库系统

    • 在数据库系统中,B树通常用于构建索引,加速数据库的查找、插入和删除操作。特别是在磁盘存储的情况下,B树的结构有利于减少磁盘I/O操作。
  3. 文件检索

    • B树可以用于构建搜索引擎的倒排索引,能够快速检索到包含特定关键字的文件或文档,应用于信息检索和全文检索系统中。
  4. 内存管理

    • 在操作系统中,B树可以用于管理虚拟内存和物理内存的分配和释放,以及页面置换算法的实现。

B+树的适用场景

  1. 数据库索引

    • B+树是数据库系统中常用的索引结构,特别适合用于范围查询和排序操作,提高了数据库查询的效率。
  2. 数据仓库

    • 在数据仓库中,B+树可以用于构建OLAP(联机分析处理)系统的多维索引,支持复杂的查询和分析操作。
  3. 文件存储

    • B+树可以用于构建文件系统的目录结构和索引,加速文件的查找和访问操作,尤其适用于大型文件存储系统。
  4. 地理信息系统

    • 在GIS(地理信息系统)中,B+树可以用于管理地理数据的空间索引,实现快速的地理空间查询和分析功能。

不同场景下的选择依据

  1. 数据访问模式

    • 如果系统主要进行范围查询和排序操作,B+树更适合;如果系统主要进行随机查找和频繁的插入、删除操作,B树可能更合适。
  2. 存储介质

    • 在磁盘存储的情况下,B+树通常具有更好的性能,因为其内部节点更小,减少了磁盘I/O操作的次数;而在内存存储的情况下,B树可能更适合,因为其节点包含了数据,减少了内存访问的次数。
  3. 查询需求

    • 如果系统需要支持范围查询、分页查询等复杂查询操作,B+树更适合;如果系统主要进行单个关键字的查找操作,B树可能更合适。

综上所述,选择B树还是B+树取决于具体的应用场景和需求,需要根据系统的数据特点、访问模式和性能要求进行权衡和选择。

实际案例分析

MySQL中的索引结构选择

MySQL数据库中使用了B树和B+树索引结构,具体选择取决于存储引擎和索引类型。

  1. InnoDB引擎

    • InnoDB存储引擎使用B+树索引结构,这是默认的存储引擎。
    • B+树索引适用于范围查询和排序操作,因此对于大多数应用场景都能够提供良好的性能。
  2. MyISAM引擎

    • MyISAM存储引擎默认使用B树索引结构。
    • B树索引在单点查询性能上可能略优于B+树,但在范围查询等场景下性能不及B+树。

Oracle中的索引结构选择

Oracle数据库中也支持多种索引类型,包括B树索引和B+树索引。

  1. B树索引

    • Oracle数据库中的普通索引(Non-Unique Index)使用了B树索引结构。
    • B树索引适用于单点查询,但在范围查询和排序操作上性能相对较低。
  2. B+树索引

    • Oracle数据库中的唯一索引(Unique Index)和聚集索引(Clustered Index)使用了B+树索引结构。
    • B+树索引在范围查询和排序操作上性能更好,适用于多种查询场景。

总体比较

  1. MySQL与Oracle

    • MySQL和Oracle数据库都采用了B树和B+树索引结构,但默认的存储引擎和索引类型不同。
    • MySQL的默认引擎InnoDB使用了B+树索引,而Oracle的普通索引采用了B树索引。
  2. 性能考量

    • 对于需要大量范围查询和排序操作的应用,B+树索引更适合;而对于单点查询较多的场景,B树索引可能更合适。
  3. 数据库优化

    • 在实际应用中,根据数据库的具体需求和性能瓶颈,可以针对性地选择适合的索引类型和存储引擎,进行数据库性能优化。

综上所述,MySQL和Oracle等数据库系统在选择B树和B+树索引结构时,需要根据具体的应用场景和性能需求进行选择,以实现最佳的数据库性能和效率。

总结

B树和B+树作为常见的索引结构,在数据库和文件系统中发挥着重要作用。它们各自具有一系列特点,针对不同的应用场景有着各自的优势和劣势。

B树的特点

  • 节点存储:B树的内部节点和叶子节点都存储数据,适用于内存较小的情况。
  • 键值分布:节点中的键值按顺序存储,适合单点查询操作。
  • 性能表现:在单点查询时性能可能略优于B+树,但在范围查询等操作上性能较差。
  • 适用场景:适合单点查询较多的情况,如文件系统的目录结构。

B+树的特点

  • 节点存储:B+树的内部节点只存储键值信息,数据全部存储在叶子节点上,适合大规模数据存储。
  • 键值分布:叶子节点之间通过链表相连,适合范围查询和排序操作。
  • 性能表现:在范围查询、排序和插入删除等操作上性能较优。
  • 适用场景:适合需要支持范围查询和排序操作的数据库系统。

总体评价

  • B树适用于单点查询较多的场景,性能可能略优于B+树,但在范围查询和排序操作上性能不及B+树。
  • B+树适用于需要支持范围查询和排序操作的场景,性能优于B树,尤其适合大规模数据存储。

综上所述,选择B树还是B+树取决于具体的应用需求和性能要求,需要根据系统的数据特点、访问模式和存储介质进行权衡和选择,以达到最佳的性能和效率。

参考文献

  1. Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to Algorithms (Third Edition). MIT Press.

  2. Silberschatz, A., Korth, H. F., & Sudarshan, S. (2010). Database System Concepts. McGraw-Hill Education.

  3. MySQL Documentation: https://dev.mysql.com/doc/

  4. Oracle Documentation: https://docs.oracle.com/

  5. Garcia-Molina, H., Ullman, J. D., & Widom, J. (2008). Database Systems: The Complete Book. Pearson.

  6. Comer, D. (1979). The Ubiquitous B-Tree. ACM Computing Surveys (CSUR), 11(2), 121-137.

  7. Lehman, P. L., & Yao, S. B. (1981). Efficient Locking for Concurrent Operations on B-Trees. ACM Transactions on Database Systems (TODS), 6(4), 650-670.

  8. Bayer, R., & McCreight, E. M. (1972). Organization and Maintenance of Large Ordered Indexes. Acta Informatica, 1(3), 173-189.

  9. Härder, T., & Reuter, A. (1983). Principles of Transaction-Oriented Database Recovery. Computing Surveys (CSUR), 15(4), 287-317.

  10. Lewis, P. M., Bernstein, P. A., & Karger, D. R. (1980). An Efficient Algorithm for Concurrently Inserting and Deleting Keys in a B-tree. ACM Transactions on Database Systems (TODS), 5(3), 354-382.

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

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

相关文章

OBS插件--视频回放

视频回放 视频回放是一款源插件,它可以将指定源的视频缓存一段时间(时间可以设定),将缓存中的视频添加到当前场景中后,可以快速或慢速不限次数的回放。这个功能在类似体育比赛的直播中非常有用,可以捕获指…

【沐风老师】3DMAX百叶窗修改器LouverGenerator安装使用方法

3DMAX百叶窗修改器LouverGenerator安装使用方法 3DMAX百叶窗修改器,在单面几何对象(或二维图形)范围内,创建百叶窗结构模型的修改器插件。修改器参数可设置动画效果。 【版本要求】 3dMax 2018及更高版本 【安装方法】 1.点击3d…

Hive UDTF之explode函数、Lateral View侧视图

Hive UDTF之explode函数 Hive 中的 explode() 函数是一种用于处理数组类型数据的 User-Defined Table-Generating Function (UDTF)。它将数组拆分成多行,每个数组元素对应生成的一行数据。这在处理嵌套数据结构时非常有用,例如处理 JSON 格式的数据。 …

读天才与算法:人脑与AI的数学思维笔记23_人工智能讲故事

1. 伟大的自动语法分析器 1.1. 思维呆板机械的阿道夫奈普(Adolphe Knipe)一直想成为一名作家,可是他写出来的东西既迂腐又无趣 1.2. 后来,灵光乍现,他得到了一个启示:语言遵循语法规则,这规则…

Mysql-用户变量的声明与使用

#声明变量 #1.标识符不能以数字开头 #2.只能使用_或$符号,不能使用其他符号 #3.不能使用系统关键字 setuserName刘德华; select userName:刘青云;#将赋值与查询结合 #查询变量、使用变量,匿名的时候建议加上as select userName as 读取到的userName变量…

Linux线程(一)初识线程

目录 一、什么是线程 二、线程和进程的区别 三、线程的操作 1、创建线程 2、获取线程ID 3、线程的终止与等待 4、线程分离 一、什么是线程 在Linux中,线程(thread)是一种轻量级进程(Light-weight Process, LWP&#xff09…

什么样的人能上百度词条

百度百科是一个向所有互联网用户开放的平台,任何人都可以创建或编辑词条。然而,并不是所有的人物或事物都能被收录到百度百科中,它有一定的收录标准和审结的关于哪些人或事物能上百度百科的条件和流程。 百度百科的收录标准 知名度和影响力&…

攻击者正在利用AI,对保险公司发起大规模欺诈

保险欺诈一直是保险行业面临的重要挑战之一,尤其随着技术的进步,欺诈者也在不断更新其手段,利用AI技术,包括生成式模型、机器学习和数据分析工具等欺骗保险公司,而AI技术的应用正成为他们的新工具,使其犯罪…

深度学习:基于TensorFlow 和 Keras,使用神经网络回归模型预测 IPL 分数

前言 系列专栏:机器学习:高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学…

性能远超GPT-4!谷歌发布Med-Gemini医疗模型;李飞飞首次创业瞄准空间智能;疫苗巨头联合OpenAl助力AI医疗...

AI for Science 企业动态速览—— * 谷歌 Med-Gemini 医疗 AI 模型性能远超 GPT-4 * 斯坦福李飞飞首次创业瞄准「空间智能」 * 疫苗巨头 Moderna 与 OpenAl 达成合作 * 美国能源部推动 AI 在清洁能源领域的应用 * 美年健康荣获「2024福布斯中国人工智能创新场景应用企业TOP10」…

Linux基础服务NFS入门篇

文章目录 Linux基础服务NFS入门篇0.前言1.NFS1.1NFS简介1.2NFS配置 Linux基础服务NFS入门篇 0.前言 本文根据大佬们的资料整理了NFS的基础知识, 加深对linux运维基础服务工具的理解,以便个人查询复习使用。 1.NFS 资料来自B站阿铭linux的印象笔记&#…

C语言 | Leetcode C语言题解之第79题单词搜索

题目: 题解: int directions[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};bool check(char** board, int boardSize, int boardColSize, int** visited, int i, int j, char* s, int sSize, int k) {if (board[i][j] ! s[k]) {return false;} else if (…

怎么样练口才_如何练口才和反应能力?

怎么样练口才_如何练口才和反应能力? 要练习口才和反应能力,以下是一些建议的方法: 一、口才练习 朗读: 每天坚持朗读一些文章,可以是报纸、杂志、书籍或网络上的文章。这有助于练习口齿清晰,积累知识量和…

ABC352编程笔记

ABC352 编程笔记 题意&#xff1a;输入&#xff0c;四个数 a , b , c , d a,b,c,d a,b,c,d&#xff0c;若 d d d 在 c , d c,d c,d 之间&#xff0c;则输出 Yes&#xff0c;否则输出 No。 正解&#xff1a;直接判断。 #include <bits/stdc.h> //#define int long lo…

2024年去除视频水印的5种方法

如果你从事电影剪辑或者视频编辑工作&#xff0c;你经常需要从优酷、抖音、TikTok下载各种视频片段……。 通常这些视频带有水印和字幕。一些免费软件如CapCut、canva、Filmora也会给你制作的视频打上水印&#xff0c;这些水印嵌入在视频内部。 2024年去除视频水印的5种方法 …

Centos 7.9如何使用源码编译安装curl最新版本

文章目录 1、前言2、curl源代码下载3、openssl安装4、编译curl4.1、配置编译环境4.2、编译输出二进制curl程序4.3、安装编译后的curl4.4、编译完成检查4.5、验证安装 1、前言 centos 7.9&#xff0c;由于系统未2017年发行&#xff0c;且以稳定性为主&#xff0c;部分工具版本较…

Unity-NGUI爆错以后-导致不能多次点击,UI假卡死问题解决方法

太久没用&#xff0c;忘了&#xff0c;NGUI好像易出错&#xff0c;就再次点击不了 导致打开了UI关闭不了&#xff0c;每次都要重启就比较烦&#xff08;说的就是那种美术团队&#xff0c;一个 UI 打开几十层&#xff09; 就好比【左上角&#xff0c;箭头】点第二次是退出不了了…

docker安装Debian:11 freeswitch1.10.5

文章目录 一、生成一个镜像二、切换一个镜像源为阿里源三、安装一些相关依赖和freeswitch3.1第一步&#xff1a;安装freeswitch-mod和下载所需的依赖项3.2 设置密钥3.3 安装freeswitch所需的依赖项3.4 报错3.4.1 报错13.4.2 报错23.4.3 报错3 四、运行4.1 通话三十秒自动挂断 一…

verilog中输入序列不连续的序列检测

编写一个序列检测模块&#xff0c;输入信号端口为data&#xff0c;表示数据有效的指示信号端口为data_valid。当data_valid信号为高时&#xff0c;表示此刻的输入信号data有效&#xff0c;参与序列检测&#xff1b;当data_valid为低时&#xff0c;data无效&#xff0c;抛弃该时…

爬虫-无限debug场景 解决方式

解决无限debug 场景1 1. 鼠标右键 选择 continue to here&#xff08;此处不停留&#xff09;2. 鼠标右键 选择 edite breakpoint 设置 10 保证条件不成立 这行永远不执行3.方法置空 1. 方法调用加断点2. 控制台 setInterval function name() {}4. 替换文件 5. hoo…