当前位置: 首页 > news >正文

数据结构之——二叉树

一、二叉树的基本概念

        二叉树是数据结构中的重要概念,每个节点最多有两个子树,分别为左子树和右子树。这种结构具有明确的层次性和特定的性质。

二叉树有五种基本形态:

  1. 空二叉树:没有任何节点。
  2. 只有一个根结点的二叉树:仅有一个节点作为整个树的根。
  3. 只有左子树:根节点仅存在左子树,右子树为空。
  4. 只有右子树:根节点仅存在右子树,左子树为空。
  5. 完全二叉树:除最后一层外,每一层的节点数都是最大的,最后一层的节点尽可能靠左排列。

        完全二叉树具有一些特点,例如叶子结点只可能出现在层序最大的两层上,并且某个结点的左分支下子孙的最大层序与右分支下子孙的最大层序相等或大 1。此外,满二叉树也是一种特殊的二叉树,除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层。平衡二叉树则是左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。

        二叉树作为一种数据结构,在实际问题中具有广泛的应用。许多实际问题抽象出来的数据结构往往是二叉树形式,因为二叉树的存储结构及其算法都较为简单。例如,在计算机科学中的搜索算法、排序算法等领域,二叉树都发挥着重要的作用。

        尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。树中结点的最大度数没有限制,而二叉树结点的最大度数为 2;树的结点无左、右之分,而二叉树的结点有左、右之分。

二、二叉树的特殊类型

(一)满二叉树

        满二叉树是一种特殊形态的二叉树。定义为除最后一层无任何子节点外,每一层上的所有结点都有两个子结点,叶子结点都在最下层,没有度为 1 的结点。其特点包括:

  1. 每层的结点数都达到最大,所有叶子结点必须在同一层上。
  2. 如果一颗树深度为 h,最大层数为 k,它的叶子数是 2^(h - 1),第 k 层的结点数是 2^(k - 1),总结点数是 2^k - 1,总节点数一定是奇数。

(二)完全二叉树

        完全二叉树是由满二叉树引出来的。对于深度为 K 的,有 n 个结点的二叉树,当且仅当其每一个结点都与深度为 K 的满二叉树中编号从 1 至 n 的结点一一对应时称之为完全二叉树。其特点如下:

  1. 叶子结点只可能在最大的两层上出现。
  2. 若 i≤⌊n/2⌋,则结点 i 为分支结点,否则为叶子结点。
  3. 对于最大层次中的叶子结点,都依次排列在该层最左边的位置上。
  4. 若有度为 1 的结点,则只可能有一个,且该结点只有左孩子而无右孩子。
  5. 按层序编号后,一旦出现某结点为叶子结点或只有左孩子,则编号大于 i 的结点均为叶子结点。
  6. 若 n 为奇数,则每个分支结点都有左孩子和右孩子;若 n 为偶数,则编号最大的分支结点只有左孩子,没有右孩子,其余分支结点左、右孩子都有。

(三)平衡二叉树

平衡二叉树又被称为 AVL 树,具有以下定义及性质:

  1. 它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。
  2. 平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。
  3. 在平衡二叉搜索树中,高度一般都良好地维持在 O(log(n)),大大降低了操作的时间复杂度。常见的算法有红黑树、AVL、Treap、伸展树等。红黑树可以在 O (log n) 时间内做查找,插入和删除;AVL 树中任何节点的两个儿子子树的高度最大差别为一,n 个结点的 AVL 树最大深度约 1.44log2n;Treap 是一棵二叉排序树,它的左子树和右子树分别是一个 Treap,同时满足堆的性质;伸展树能在 O (log n) 内完成插入、查找和删除操作。

三、二叉树的性质

二叉树具有多种重要性质,这些性质对于理解和操作二叉树至关重要。

(一)节点总数与深度关系

        对于一棵深度为 k 的二叉树,最多具有 2^{_{k}}-1个结点,最少有 k 个结点。这是因为每一层的节点数是上一层的两倍,深度为 k 的满二叉树的节点总数为 2^{_{k}}-1。而对于非满二叉树,其节点总数会小于这个值,但至少有 k 个结点,因为每一层至少有一个结点。

(二)叶子结点与度为 2 的结点关系

        对于任何一棵二叉树,如果其叶结点数为 n_{0},度为 2 的结点数为 n_{2},则有 n_{0}=n_{2}+1。证明如下:如果 n_{0}表示度为 0(即叶子结点)的结点数,用 n_{1}表示度为 1 的结点数,n_{2} 表示度为 2 的结点数,n 表示整个完全二叉树的结点总数,则有 n=n_{0}+n_{1}+n_{2}。根据二叉树和树的性质,可知 n=n_{1}+2*n_{2}+1(所有结点的度数之和加 1 等于结点总数)。根据两个等式可知 n_{0}+n_{1}+n_{2}=n_{1}+2*n_{2}+1,即 n_{2}=n_{0}-1,也即 n_{0}=n_{2}+1

(三)完全二叉树的深度性质

        具有 n个结点的完全二叉树的深度为 ⌊log2n⌋ + 1。证明:根据性质 2,深度为 k的二叉树,最多有 2^k - 1个结点,且完全二叉树的定义是与同深度的满二叉树前边的编号相同,即它们的结点总数n 位于 k层和 k-1层的满二叉树容量之间,即 2^{k - 1} - 1 < n <= 2^k - 1之间,或 2^{k - 1} <= n < 2^k,两边同时取对数得,k - 1 <= log2(n) < k ,又因层数为整数,故log2(n)=k - 1 ,即 k = log2(n)+1。

        这些性质在实际应用中非常有用,例如在计算二叉树的节点数量、判断二叉树的结构特点等方面。了解这些性质可以帮助我们更好地理解和使用二叉树这种数据结构。

四、二叉树的存储结构

(一)顺序存储结构

        顺序存储结构是指用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。对于完全二叉树来说,顺序存储是十分合适的,因为完全二叉树的节点可以按照层次编号依次存储在数组中,通过节点的编号可以快速确定其在数组中的位置,进而方便地找到其双亲、左右孩子节点。

        在完全二叉树的顺序存储中,数组的下标与节点的编号有直接对应关系。例如,对于一个深度为 的完全二叉树,其节点总数最多为 。如果节点编号从 开始,那么根节点存储在数组下标为 的位置,节点 的左孩子存储在下标为 的位置,右孩子存储在下标为 的位置,节点 的双亲节点存储在下标为 的位置。

        然而,顺序存储结构也有明显的优缺点。优点包括:索引计算简单,通过节点在数组中的索引,可以快速计算出其父节点、左子节点和右子节点的索引,不需要进行指针操作,提高了访问效率;存储紧凑,相比于链式存储,顺序存储不需要额外的指针空间,节省了存储空间;遍历方便,由于节点在数组中的顺序与遍历顺序一致,可以方便地进行层次遍历、前序遍历、中序遍历和后序遍历等操作。

        缺点主要有:空间浪费,如果二叉树是一棵稀疏树(即节点较少),那么顺序存储会造成大量的空间浪费,因为数组中会有很多位置被空节点占据;插入和删除操作复杂,由于顺序存储需要保持二叉树的完全二叉树结构,插入和删除节点时需要进行大量的数据搬移操作,效率较低;高度限制,顺序存储的数组长度是固定的,因此对于高度较大的二叉树,可能会导致数组长度不够,无法存储完整的二叉树。

(二)链式存储结构

1.二叉链表

        二叉链表是二叉树的一种常见链式存储结构。在二叉链表中,每个节点包含三个域:数据域、左指针域和右指针域。当左孩子或右孩子不存在时,相应指针域值为空。

        二叉链表的特点是:除了指针外,二叉链比较节省存储空间。占用的存储空间与树形没有关系,只与树中节点个数有关。在二叉链中,找一个节点的孩子很容易,但找其双亲不方便。

        二叉链表适用于各种类型的二叉树,尤其是那些非完全二叉树。在实际应用中,二叉链表常用于二叉树的遍历、查找、插入和删除等操作。例如,在二叉树的遍历中,可以通过递归或非递归的方式遍历二叉链表,实现对二叉树中每个节点的访问。

2.三叉链表

        三叉链表是二叉树链式存储结构的另一种形式。三叉链表与二叉链表的主要区别在于,它的节点比二叉链表的节点多一个指针域,该域用于存储指向本节点双亲的指针。

        在三叉链表中,每个结点由四个域组成,其中,data、lchild 以及 rchild 三个域的意义与二叉链表结构相同。这种存储结构既便于查找孩子结点,又便于查找双亲结点。但是,相对于二叉链表存储结构而言,它增加了空间开销。

        三叉链表适用于需要频繁查找双亲节点的场景。例如,在某些算法中,需要快速找到某个节点的双亲节点进行操作,此时三叉链表就可以发挥其优势。不过,由于其增加了空间开销,在空间有限的情况下,需要权衡使用。

五、二叉树的遍历方式

(一)先序遍历

        先序遍历的顺序是根左右,即先访问根节点,再访问左子树,最后访问右子树。

在 C 语言中,先序遍历可以通过递归和非递归两种方式实现。

1.递归实现:

// 前序遍历二叉树的函数,假设 BiTree 是一个二叉树类型
void preOrder(BiTree T) {// 如果当前节点不为空if (T!= NULL) {// 调用 visit 函数访问当前节点,visit 函数应该是一个自定义的用于处理节点的函数visit(T);// 递归遍历左子树preOrder(T->lchild);// 递归遍历右子树preOrder(T->rchild);}// 函数返回,结束遍历return;
}

2.非递归实现:借助栈实现,先将根节点入栈,当栈不为空时,取出栈顶元素并访问,然后将其右孩子和左孩子依次入栈(如果存在)。

// 非递归实现前序遍历二叉树的函数,假设 BiTree 是一个二叉树类型
void preOrderNonRecursive(BiTree T) {// 创建一个栈Stack stack;// 初始化栈initStack(&stack);// 将根节点入栈push(&stack, T);// 当栈不为空时循环while (!isEmpty(&stack)) {// 弹出栈顶元素BiTree node = pop(&stack);// 如果弹出的节点不为空if (node!= NULL) {// 访问该节点visit(node);// 先将右子树入栈(因为先访问左子树,后访问右子树)push(&stack, node->rchild);// 再将左子树入栈push(&stack, node->lchild);}}
}

(二)中序遍历

中序遍历的顺序是左根右,即先访问左子树,再访问根节点,最后访问右子树。

C 语言实现方式如下:

1.递归实现:

// 中序遍历二叉树的函数,假设 BiTree 是一个二叉树类型
void midOrder(BiTree T) {// 如果当前节点不为空if (T!= NULL) {// 先递归遍历左子树midOrder(T->lchild);// 访问当前节点visit(T);// 再递归遍历右子树midOrder(T->rchild);}// 函数返回,结束遍历return;
}

2.非递归实现:借助栈实现,从根节点开始,将其所有左孩子依次入栈,直到左孩子为空。然后弹出栈顶元素并访问,接着将其右孩子作为新的根节点重复上述过程。

// 非递归实现中序遍历二叉树的函数,假设 BiTree 是一个二叉树类型
void midOrderNonRecursive(BiTree T) {// 创建一个栈Stack stack;initStack(&stack);// 设置当前节点为传入的根节点BiTree node = T;// 当当前节点不为空或者栈不为空时循环while (node!= NULL ||!isEmpty(&stack)) {if (node!= NULL) {// 当前节点不为空时,将其入栈,并将当前节点移动到左子节点push(&stack, node);node = node->lchild;} else {// 当前节点为空,说明左子树已遍历完,从栈中弹出一个节点node = pop(&stack);// 访问该节点visit(node);// 将当前节点移动到右子节点node = node->rchild;}}
}

(三)后序遍历

后序遍历的顺序是左右根,即先访问左子树,再访问右子树,最后访问根节点。

C 语言代码实现:

1.递归实现:

// 后序遍历二叉树的函数,假设 BiTree 是一个二叉树类型
void afterOrder(BiTree T) {// 如果当前节点不为空if (T!= NULL) {// 先递归遍历左子树afterOrder(T->lchild);// 再递归遍历右子树afterOrder(T->rchild);// 最后访问当前节点visit(T);}// 函数返回,结束遍历return;
}

2.非递归实现:借助栈实现,需要额外使用一个辅助栈来记录遍历顺序。先将根节点入栈,然后依次将其右孩子和左孩子入栈(如果存在)。当栈为空时,遍历结束。最后将辅助栈中的元素依次弹出并访问,得到后序遍历结果。

// 非递归实现后序遍历二叉树的函数,假设 BiTree 是一个二叉树类型
void afterOrderNonRecursive(BiTree T) {// 创建两个栈 stack1 和 stack2Stack stack1, stack2;// 初始化 stack1initStack(&stack1);// 初始化 stack2initStack(&stack2);// 将根节点入栈 stack1push(&stack1, T);// 当 stack1 不为空时循环while (!isEmpty(&stack1)) {// 从 stack1 弹出一个节点BiTree node = pop(&stack1);// 将弹出的节点入栈 stack2push(&stack2, node);// 如果当前节点的左子树不为空,将左子树入栈 stack1if (node->lchild!= NULL) {push(&stack1, node->lchild);}// 如果当前节点的右子树不为空,将右子树入栈 stack1if (node->rchild!= NULL) {push(&stack1, node->rchild);}}// 当 stack2 不为空时循环while (!isEmpty(&stack2)) {// 从 stack2 弹出一个节点并访问visit(pop(&stack2));}
}

(四)层次遍历

        层次遍历是从上层至下层,同层自左至右遍历。借助队列实现,先将根节点入队,然后当队列不为空时,取出队首元素并访问,接着将其左孩子和右孩子依次入队(如果存在),直到队列为空。

C 语言代码如下:

// 层次遍历二叉树的函数,假设 BiTree 是一个二叉树类型
void levelOrder(BiTree T) {// 创建一个队列Queue queue;// 初始化队列initQueue(&queue);// 将根节点入队enqueue(&queue, T);// 当队列不为空时循环while (!isEmptyQueue(&queue)) {// 从队列中取出一个节点BiTree node = dequeue(&queue);// 如果取出的节点不为空if (node!= NULL) {// 访问该节点visit(node);// 将该节点的左子节点入队enqueue(&queue, node->lchild);// 将该节点的右子节点入队enqueue(&queue, node->rchild);}}
}

六、二叉树的应用场景

        二叉树在计算机科学领域有广泛的应用场景,以下是对其在不同领域的具体介绍:

(一)哈夫曼编码

        哈夫曼编码是一种使用二叉树(特别是赫夫曼树)实现的数据压缩方法。它通过构建一个带权路径长度最短的二叉树,即最优二叉树,来提高数据传输的有效性。具体步骤如下:

  1. 首先将待编码的文章当成一个字符串,遍历这个字符串中所有的字符,并且统计每一个字符出现的次数。
  2. 根据字符出现的次数对字符进行排序。
  3. 选取排序后出现次数最少的两个字符加入哈夫曼树,并将两个字符的出现次数取值相加,合并成为一个中间节点。中间节点仅记录两个节点取值的加和,但是不记录任何字符。
  4. 将中间节点加入字符排序序列中,删除已经使用过的节点,对序列重新排序,重复步骤 2 - 4,构建过程中产生的中间节点也算作在内。
  5. 当所有的字符和中间节点全部合成完毕时,序列中只剩余一个节点,就是哈夫曼树的根节点,哈夫曼树创建完毕。

        接着为每一个存储字符的节点分配哈夫曼编码:从根节点开始,向下寻找每一个叶子节点;如果向左孩子方向走一步,则记 0;如果向右孩子方向走一步,则记 1;重复上述步骤,直到遍历完成整个哈夫曼树为止,最终得到根节点通往每一个叶子节点的路径字符串,就是这个叶子节点对应字符的哈夫曼编码。

        例如,一篇文章经过哈夫曼编码后,完全由 0 和 1 构成,且每一篇文章因为内容的不同,即使是相同的字符所对应的哈夫曼编码也是不同的。所以,即使单纯得到一篇文章的密文结构,没有得到对应的哈夫曼编码表,也是无法进行解密的。哈夫曼树和哈夫曼编码在密码学当中具有非常高的学术研究价值。

(二)海量数据并发查询

        在处理大量动态数据时,二叉排序树(二叉查找树)因其既有链表的好处也有数组的好处,能够在处理大批量的动态数据时提供高效的查询性能。这种数据结构在复杂度为 O (K + LgN) 的情况下,对于海量数据的并发查询非常有用。

        例如,在一些需要处理大量实时数据的系统中,如金融交易系统、网络流量监测系统等,二叉排序树可以快速地对数据进行查找和插入操作,满足系统对数据处理的实时性要求。

(三)数据结构实现

        C++ STL 中的 set/multiset、map 以及 Linux 虚拟内存的管理,都是通过红黑树实现的。红黑树能够在查找、插入和删除操作中保持相对平衡,提供高效的查找效率,最大查找 / 删除 / 插入操作的时间复杂度为 O (logk)。

        红黑树是一种自平衡的二叉查找树,它在插入和删除操作后通过旋转和翻色,自动调整结构以保持平衡,从而保证了查找、插入和删除操作的效率。在内存中的有序数据存储中,红黑树可以快速地进行增删操作,且由于内存存储不涉及 I/O 操作,红黑树的性能优势更加明显。此外,红黑树还适用于实现 Key - Value 对的数据结构,通过键值对进行查找,适用于需要快速查找特定键值对应的值的应用场景。

(四)文件系统

        B - Tree 和 B+ - Tree 在文件系统中有着重要的应用,特别是在目录管理上。它们能够高效地处理大量的数据,并提供快速的查找、插入和删除操作,这对于文件系统的性能至关重要。

        B + 树只在叶节点存储数据,而非叶子节点只存储索引信息。这种结构使得 B + 树能够更好地适应磁盘读取方式,因为在磁盘上读取一条记录的成本非常高。B + 树的叶节点形成了一个链表,可以很容易地实现范围查询,非常适合需要高效处理大量数据的系统。此外,B + 树相比 B 树有更好的空间利用率和查询性能,更适合用作大型数据库的索引结构。B + 树的所有数据记录都存储在叶子节点上,且叶子节点同时还维护了一条双向链表,这提高了范围查询的效率。因此,B + 树在需要处理大量范围查询和排序操作的场景中表现出色,如文件系统等。

(五)路由搜索引擎

        路由器使用二叉树结构进行路由表的查找,这种结构能够快速地根据目的地址查找最佳的路由路径,从而提高网络通信的效率。

        例如,在互联网中,路由器需要根据数据包的目的地址快速地选择最佳的路由路径,将数据包转发到正确的目的地。二叉树结构可以有效地组织路由表,使得路由器能够快速地进行查找和决策,提高网络通信的效率和可靠性。

相关文章:

数据结构之——二叉树

一、二叉树的基本概念 二叉树是数据结构中的重要概念&#xff0c;每个节点最多有两个子树&#xff0c;分别为左子树和右子树。这种结构具有明确的层次性和特定的性质。 二叉树有五种基本形态&#xff1a; 空二叉树&#xff1a;没有任何节点。只有一个根结点的二叉树&#xff…...

多层感知机(MLP)实现考勤预测二分类任务(sklearn)

1、基础应用&#xff1a; https://blog.csdn.net/qq_36158230/article/details/118670801 多层感知机(MLP)实现考勤预测二分类任务(sklearn) 2、分类器参数&#xff1a;https://scikit-learn.org/dev/modules/generated/sklearn.neural_network.MLPClassifier.html 3、损失函数…...

文件与目录的基本操作

前提&#xff1a;使用su root 切换到权限最大的root用户 1.显示当前工作目录的绝对路径&#xff08;pwd&#xff09; 用途&#xff1a;用于显示当前工作目录的绝对路径的命令。无论用户在文件系统的哪个位置&#xff0c;pwd 命令都能提供当前所在位置的完整路径信息。 用法&a…...

Python入门笔记(三)

文章目录 第八章 字典dict8.1 创建字典&#xff1a;{}、dict()、字典生成式、zip()8.2 获取键对应的值&#xff1a;get()8.3 in&#xff0c; not in判断键是否在字典中8.4 增加键值对&#xff1a;fromkeys()、setdefault()、update()8.5 删除键值对&#xff1a;del语句、clear(…...

PostgreSQL 任意命令执行漏洞(CVE-2019-9193)

记一次授权攻击通过PostgreSql弱口令拿到服务器权限的事件。 使用靶机复现攻击过程。 过程 在信息收集过程中&#xff0c;获取到在公网服务器上开启了5432端口&#xff0c;尝试进行暴破&#xff0c;获取到数据库名为默认postgres&#xff0c;密码为1 随后连接进PostgreSql …...

使用tgz包下载安装clickhouse低版本

1.下载安装包 官方下载地址&#xff1a;https://packages.clickhouse.com/tgz/stable 阿里云下载地址&#xff1a;clickhouse-tgz-stable安装包下载_开源镜像站-阿里云 共需要下载四个文件 clickhouse-common-static-20.3.10.75.tgz clickhouse-common-static-dbg-20.3.10.7…...

外包功能测试干了6个月,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;23年通过校招进入武汉某软件公司&#xff0c;干了差不多6个月的功能测试&#xff0c;今年中秋&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我就在一个外包企业干了6个月的功…...

动态规划和贪心算法

目录 动态规划和贪心算法 动态规划 贪心算法 两者之间的区别 动态规划和贪心算法 是两种经典的算法设计策略,它们各自具有独特的特点和适用场景。 动态规划 动态规划是一种将复杂问题分解为更简单子问题的求解方法。它特别适用于那些具有重叠子问题和最优子结构特性的问…...

python爬虫--tx动漫完整信息抓取

python爬虫--tx动漫完整信息抓取 一、采集主页信息二、采集详情页信息三、完整代码一、采集主页信息 先看一下采集到的信息,结果保存为csv文件: 打开开发者工具,找到数据接口。 使用xpath提取详情页url。 二、采集详情页信息 如上图所示,使用xpath提取详情页的标题、作…...

《使用Java做爬虫和使用python做爬虫哪个好》

使用Java做爬虫和使用python做爬虫哪个好 Java 和 Python 都是非常出色的编程语言&#xff0c;在爬虫领域各有其优势&#xff0c;具体使用哪种语言更好取决于多种因素&#xff1a; 一、开发效率 1. Python Python 以其简洁、易读的语法而闻名。在爬虫开发中&#xff0c;有许…...

如果我想开发一个APP,需要准备哪些材料呢

开发一个APP需要准备的材料相对复杂&#xff0c;涵盖了公司资质、技术资源、支付接口以及第三方服务等多个方面。以下是一份详细的材料清单&#xff1a; 一、公司资质证明 营业执照&#xff1a;需要提供公司的营业执照副本&#xff0c;用于申请企业支付、域名备案、APP上架及…...

告别论文初稿焦虑!ChatGPT让你轻松完成写作!

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在面对繁琐的论文写作时&#xff0c;很多人都会遇到无从下手的困惑&#xff0c;尤其是论文初稿阶段&#xff0c;往往需要大量的时间来组织思路和编写内容。然而&#xff0c;随着AI技术的发展&#xff0c;像…...

mongodb 数据迁移,亲测成功!

mysql进行数据迁移&#xff0c;最简单的不过是导出sql&#xff0c;然后在运行sql&#xff0c;数据也自然迁移过去了。 可是mongodb里&#xff0c;我们存储的是文件&#xff0c;是怎么做到的呢&#xff0c;当我在翻阅网上博客的时候&#xff0c;并没有发现有这方面的顾虑。 当…...

如何使用ssm实现疫情居家办公OA系统

TOC 10902ssm疫情居家办公OA系统 系统概述 进过系统的分析后&#xff0c;就开始记性系统的设计&#xff0c;系统设计包含总体设计和详细设计。总体设计只是一个大体的设计&#xff0c;经过了总体设计&#xff0c;我们能够划分出系统的一些东西&#xff0c;例如文件、文档、数…...

深入了解 MySQL 中的 JSON_CONTAINS

深入了解 MySQL 中的 JSON_CONTAINS MySQL 5.7 及更高版本引入了对 JSON 数据类型的支持&#xff0c;使得在数据库中存储和查询 JSON 数据成为可能。在这些新功能中&#xff0c;JSON_CONTAINS 函数是一个非常有用的工具&#xff0c;允许我们检查一个 JSON 文档是否包含特定的值…...

宝藏推荐:精选十款知识库搭建软件

当今这个信息爆炸的时代&#xff0c;高效地管理和利用知识成为了各行各业追求的目标。无论是企业内部的协作&#xff0c;还是对外提供的信息服务&#xff0c;一个强大的知识库都是不可或缺的。为了帮助大家更好地守护和利用知识宝藏&#xff0c;以下是精选的十款知识库搭建软件…...

go语言接口设计三国人物

题目 请设计一个接口Person&#xff0c;然后设计两个结构体实现Person接口&#xff0c;这两个结构体都代表三国时代的名人。Person接口中有一个方法&#xff0c;该方法输出一句最能代表该人物特点的话。 程序 package main import ("fmt") type Person interface …...

day-63 优质数对的总数 II

思路 nums1[i] 可以被 nums2[j] * k 整除,所以nums[i]/k的所有因子都符合条件&#xff0c;问题转换为遍历nums1,统计nums[i]/k的因子出现次数&#xff0c;然后遍历nums2&#xff0c;如果nums2[i]是某一个因子&#xff0c;将其出现次数加入答案中即可 解题过程 利用哈希表统计出…...

基于 Prometheus+Grafana+Alertmanager 搭建 K8S 云监控告警平台(附配置告警至QQ、钉钉)

文章目录 一、机器规划二、部署安装 node-exporter、prometheus、Grafana、kube-state-metrics1、创建 monitor-sa 命名空间2、安装node-exporter组件2.1、说明2.2、应用资源清单2.3、通过node-exporter采集数据 3、k8s 集群中部署 prometheus3.1、创建一个 sa 账号3.2、将 sa …...

C++ | Leetcode C++题解之第461题汉明距离

题目&#xff1a; 题解&#xff1a; class Solution { public:int hammingDistance(int x, int y) {int s x ^ y, ret 0;while (s) {s & s - 1;ret;}return ret;} };...

ElasticSearch备考 -- Update by query Reindex

一、题目 有个索引task&#xff0c;里面的文档长这样 现在需要添加一个字段all&#xff0c;这个字段的值是以下 a、b、c、d字段的值连在一起 二、思考 需要把四个字段拼接到一起&#xff0c;组成一个新的字段&#xff0c;这个就需要脚本&#xff0c; 这里有两种方案&#xff…...

从认识String类,到走进String类的世界

作为一个常用的数据类型&#xff0c;跟随小编一同进入String的学习吧&#xff0c;领略String的一些用法。 1. 认识 String 类 2. 了解 String 类的基本用法 3. 熟练掌握 String 类的常见操作 4. 认识字符串常量池 5. 认识 StringBuffer 和 StringBuilder 一&#xff1a;…...

Vue入门-指令修饰符-@keyup.enter

指令修饰符&#xff1a; 通过"."指明一些指令后缀&#xff0c;不同后缀封装了不同的处理操作 ->简化代码 ①按键修饰符 keyup.enter ->键盘回车监听 ".enter"if(e.keyenter){} //".enter"用来简化代码 demo&#xff1a; <!DOCTYPE…...

【Kubernetes】常见面试题汇总(五十九)

目录 129.问题&#xff1a;pod 使用 PV 后&#xff0c;无法访问其内容&#xff1f; 130.查看节点状态失败&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xf…...

【ARM Linux驱动开发】嵌入式ARM Linux驱动开发基本步骤

【ARM Linux驱动开发】嵌入式ARM Linux驱动开发基本步骤 文章目录 开发环境驱动开发&#xff08;以字符设备为例&#xff09;安装驱动应用程序开发附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 开发环境 首先需要交叉编译器和Linux环境…...

SpinalHDL之设计错误(Design Errors)(一)

本文作为SpinalHDL学习笔记第七十四篇,介绍SpinalHDL的设计错误。 目录: 1.赋值覆盖(Assignment Overlap) 2.跨时钟域违例(Clock crossing violation) 3.组合环(Combinatorial loop) 4.层次违例(Hierarchy violation) 5.IO包 ⼀、赋值覆盖(Assignment Overlap) ⼀、简介…...

QT + opengl 让2d贴图动起来

1 qtopengl 实现纹理贴图&#xff0c;平移旋转&#xff0c;绘制三角形&#xff0c;方形-CSDN博客 在上篇文章里面我已经学会了给贴图&#xff0c;并且旋转&#xff0c;那我们如何动态的显示2D的图片呢&#xff0c;那我们在qt里面是如何实现呢&#xff0c;定时器连续更新。 上…...

【selenium】webdriver测试脚本

【背景】 不同电脑上运行selenium时总是因为环境问题出幺蛾子&#xff0c;所以需要一个最简单的脚本每次先验证一下能不能正常启用selenium。 【脚本】 这个脚本做的事情就是试着用selenium启动网页&#xff0c;默认用了百度首页&#xff0c;也可以根据情况自己修改。 from…...

工业自动化中的关键信号:开关量、模拟量与脉冲量

工业自动化和控制系统中&#xff0c;信号的类型对于数据处理和决策至关重要。主要的信号类型包括开关量、模拟量和脉冲量。每种信号类型都有其独特的特点和应用场景&#xff0c;它们共同构成了自动化系统的基础。这三种信号的特点、应用及其在现代工业自动化中的重要性。 开关…...

VMware vCenter Server 8.0U3c 发布下载,修复 U3b 更新停止响应的问题

VMware vCenter Server 8.0U3c 发布下载 - 集中式管理 vSphere 环境 Server Management Software | vCenter 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vcenter-8-u3/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMw…...