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

AVL平衡树(AVL Tree)

**场景:课堂讨论**

---

**小明(ESFP学生)**:张老师,为什么AVL树(AVL Tree)中的旋转操作这么重要?感觉只是节点的移动,有没有什么实际意义?

**张老师(ENTP老师)**:好问题,小明!旋转在AVL树中不只是简单的节点移动,它在保持树的平衡性方面起着关键作用。让我用几个例子来说明。

#### 例子1:图书馆书架摆放

- **张老师**:想象一下,图书馆的书架(Bookshelf)如果一边书多,一边书少,拿书的时候是不是很不方便?
- **小明**:是的,会导致某边的书难以找到。
- **张老师**:AVL树的旋转就像重新摆放书架上的书,让两边的书一样多,方便取书。

**代码示例**:
```python
# 节点类定义
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None
        self.height = 1

def right_rotate(y):
    x = y.left  # x是y的左子节点
    T2 = x.right  # T2是x的右子树,准备重新挂接
    x.right = y  # y成为x的右子节点
    y.left = T2  # T2成为y的左子节点
    # 更新高度
    y.height = 1 + max(get_height(y.left), get_height(y.right))
    x.height = 1 + max(get_height(x.left), get_height(x.right))
    return x  # 返回新的子树根节点

def get_height(node):
    if not node:
        return 0
    return node.height
```

这段代码定义了一个简单的AVL树节点类`TreeNode`以及一个用于右旋的函数`right_rotate`。我们可以逐步解释这段代码的组成部分和功能:

### 1. `TreeNode` 类

```python
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None
        self.height = 1
```

- **`__init__` 方法**:初始化一个树节点。
  - `value`:节点的值。
  - `left` 和 `right`:指向左子节点和右子节点的指针,初始为 `None`。
  - `height`:节点的高度,初始为1,因为新节点没有子节点时,高度为1。

### 2. `right_rotate` 函数

```python
def right_rotate(y):
    x = y.left  # x是y的左子节点
    T2 = x.right  # T2是x的右子树,准备重新挂接
    x.right = y  # y成为x的右子节点
    y.left = T2  # T2成为y的左子节点
    # 更新高度
    y.height = 1 + max(get_height(y.left), get_height(y.right))
    x.height = 1 + max(get_height(x.left), get_height(x.right))
    return x  # 返回新的子树根节点
```

- **参数 `y`**:需要进行右旋转的子树的根节点。
- **旋转过程**:
  1. `x = y.left`:将 `y` 的左子节点 `x` 存储。
  2. `T2 = x.right`:将 `x` 的右子树(如果有)存储为 `T2`。
  3. `x.right = y`:将 `y` 设为 `x` 的右子节点。
  4. `y.left = T2`:将 `T2` 挂在 `y` 的左子节点上。
- **更新高度**:
  - `y.height`:重新计算 `y` 的高度,等于其左右子树高度的最大值加1。
  - `x.height`:重新计算 `x` 的高度。
- **返回值**:返回新的子树根节点 `x`。

### 3. `get_height` 函数

```python
def get_height(node):
    if not node:
        return 0
    return node.height
```

- **功能**:返回节点的高度。如果节点不存在(`None`),返回高度为0。

### 使用场景

- 这些函数是AVL树实现的一部分。AVL树是一种自平衡的二叉查找树,插入和删除操作后会通过旋转保持树的平衡。
- `right_rotate` 是在AVL树中处理左重情况的一种旋转操作,它在插入或删除节点后用于恢复平衡。

### 示例

假设我们有一个不平衡的子树:

```
    y
   /
  x
   \
    T2
```

执行 `right_rotate(y)` 后:

```
  x
   \
    y
   /
 T2
```

通过右旋,树变得更加平衡。这是AVL树保持高度平衡的关键操作之一。

#### 例子2:交通信号灯

- **张老师**:再想象一下交通信号灯(Traffic Light),如果一边的车流过多,另一边很少,会造成交通堵塞。
- **小明**:确实,那需要调整信号灯的时间。
- **张老师**:在AVL树中,旋转就像调整信号灯的时间,保证两边车流均匀。

#### 例子3:团队工作分配

- **张老师**:最后,想象一个项目团队(Project Team),某些人工作过多,另一些人却很闲,会影响效率。
- **小明**:对,应该重新分配工作。
- **张老师**:AVL树的旋转就像重新分配任务,让每个人都有合理的工作量。

---

**小明(ESFP学生)**:明白了,旋转可以保持平衡,类似于现实生活中的许多场景。那旋转的具体操作就是为了确保树的高度尽可能小,从而提高效率,对吗?

**张老师(ENTP老师)**:完全正确!通过这些例子,你可以看到旋转在数据结构中帮助我们保持平衡状态,从而提高操作效率。

---

### 思维导图总结

```
[旋转在AVL树中的意义]
    ├── 保持平衡
    │   ├── 高效查找
    │   └── 高效插入/删除
    ├── 实际应用类比
    │   ├── 图书馆书架
    │   ├── 交通信号灯
    │   └── 团队工作分配
    └── 实现例子
        ├── 右旋操作代码
        └── 高度更新
```

**老师(ENTP)**:同学们,今天我们来探讨AVL树(AVL Tree),这是一种自平衡的二叉查找树(Binary Search Tree, BST)。它的名字来自于两位发明者的首字母组合。首先,谁能告诉我AVL树的两个主要特性是什么?

**学生(ESFP)**:嗯,AVL树有两个主要特性吧?一个是它遵循二叉查找树的性质,另一个是它的平衡性。也就是每个节点的左子树和右子树的高度差不超过1,对吗?

**老师(ENTP)**:没错!AVL树的平衡性通过平衡因子(Balance Factor, BF)来监控。这个因子就是左子树高度减去右子树高度的值。现在,我们来看一个例子。假设我们有一个节点A,它的左子树高度是2,右子树高度是1,那么A的平衡因子是多少?

**学生(ESFP)**:平衡因子就是2减去1,所以是1。这说明A是平衡的。

**老师(ENTP)**:完全正确。那么当我们插入一个新节点导致平衡因子超过1或小于-1时,该怎么处理呢?

**学生(ESFP)**:我想这时候需要做旋转操作(Rotation)来恢复平衡。不过,可以再详细讲讲旋转吗?

**老师(ENTP)**:当然。旋转分为四种基本类型:LL(左左)旋转、LR(左右)旋转、RR(右右)旋转和RL(右左)旋转。我们通过一个具体例子来说明。

### 例子1:LL旋转

**老师(ENTP)**:假设我们有一个不平衡的子树:

```
    C
   /
  B
 /
A
```

这是一个典型的左左(LL)不平衡。我们要对节点C进行右旋(Right Rotation)。右旋后,树变成:

```
  B
 / \
A   C
```

**老师(ENTP)**:通过这次旋转,树重新获得平衡。请注意,旋转操作是局部的,只影响特定的子树。

### 例子2:LR旋转

**老师(ENTP)**:接下来,我们看看左右(LR)旋转的情况。假设我们有:

```
    C
   /
  A
   \
    B
```

首先,对A进行左旋(Left Rotation),得到:

```
    C
   /
  B
 /
A
```

接着,对C进行右旋,最终结果是:

```
  B
 / \
A   C
```

这样,我们通过两次旋转恢复了平衡。

### 例子3:RR旋转

**老师(ENTP)**:我们再看一个右右(RR)旋转的例子:

```
A
 \
  B
   \
    C
```

这是一个右右不平衡,我们对A进行左旋:

```
  B
 / \
A   C
```

**老师(ENTP)**:通过左旋,树重新平衡。

**学生(ESFP)**:我明白了,旋转就是为了调整树的结构,使得每个节点的平衡因子在-1到1之间。通过这种方式,AVL树保持了高效的查找、插入和删除操作。

**老师(ENTP)**:很棒的总结!AVL树在数据库索引、文件系统索引等需要频繁查找且保持数据有序的场景中非常有用。虽然在插入和删除时可能需要多次旋转,但它的平衡性更高,这在查找操作中尤为重要。

**老师(ENTP)**:很好!现在我们更深入地探讨一下AVL树的一些实现细节和优化策略。首先,我们来看一下AVL树的节点结构。一般来说,AVL树节点除了存储键值对外,还需要保存什么信息呢?

**学生(ESFP)**:节点除了保存键值对,还需要保存左右子树的指针、父节点指针,以及一个平衡因子以记录高度差。

**老师(ENTP)**:对的。以下是一个C++中AVL节点的简化结构:

```cpp
template<class K, class V>
struct AVLNode {
    AVLNode<K, V>* _left;
    AVLNode<K, V>* _right;
    AVLNode<K, V>* _parent;
    int _bf; // 平衡因子
    pair<K, V> _kv; // 键值对
    AVLNode(const pair<K,V>& kv) : _bf(0), _kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr) {}
};
```

**老师(ENTP)**:这种结构允许我们在旋转时轻松调整指针,并在插入和删除后快速更新平衡因子。接下来,我们来看看插入操作的具体流程。

### 插入操作详细流程

**老师(ENTP)**:插入操作分为几个步骤:标准的BST插入、更新平衡因子、检查平衡并进行必要的旋转修正。

1. **标准BST插入**:按照二叉查找树的规则插入新节点。
2. **更新平衡因子**:从插入点开始向上回溯,更新每个节点的平衡因子。
3. **检查平衡并旋转**:如果某个节点的平衡因子超过1或小于-1,确定不平衡类型(LL、LR、RR、RL)并进行相应的旋转。

**学生(ESFP)**:所以每次插入后我们都要回溯到根节点,检查并修正所有可能的不平衡?

**老师(ENTP)**:通常只需修正第一个遇到的不平衡节点,因为旋转操作会恢复该子树的平衡,其父节点的平衡因子可能也会恢复正常。

### AVL树的应用场景

**学生(ESFP)**:AVL树和红黑树(Red-Black Tree)相比有什么优缺点呢?

**老师(ENTP)**:AVL树比红黑树具有更严格的平衡性,这意味着在查找操作中,AVL树的性能通常更好。然而,这种严格的平衡性也意味着在插入和删除时,AVL树可能需要更多旋转,导致这些操作的开销比红黑树稍高。

**老师(ENTP)**:因此,AVL树适合用于查找频繁且插入删除较少的场景,比如数据库索引。而红黑树在插入和删除操作频繁的场合可能更具优势,比如在STL的map和set实现中。

 

**老师(ENTP)**:太好了,既然你对AVL树在实际应用中的实现细节感兴趣,我们就继续探讨一下它在数据库索引中的具体应用。

### AVL树在数据库索引中的应用

在数据库中,索引是一种用于快速查找记录的数据结构。AVL树可以作为一种索引结构,帮助提高查询效率。我们来看看它在数据库中的典型应用。

#### 1. **快速查找**

**老师(ENTP)**:AVL树的平衡性使得查找操作非常高效,时间复杂度为O(log n)。在数据库索引中,AVL树可以用来组织记录的主键或唯一键,使得通过键值来查找记录变得快速。

**学生(ESFP)**:这是不是意味着当有大量数据时,AVL树能保证查找时间不会因为数据量增加而显著变长?

**老师(ENTP)**:正是如此。无论数据量多大,AVL树的深度始终保持在O(log n),确保查找操作的效率。

#### 2. **有序数据存储**

**老师(ENTP)**:由于AVL树也是一种二叉查找树,它天然支持有序数据的存储和遍历。这对于需要按顺序检索数据的查询非常有用,比如范围查询。

**学生(ESFP)**:这就是说,如果我想找出数据库中某个范围内的所有记录,AVL树可以帮助快速定位?

**老师(ENTP)**:没错,AVL树支持中序遍历(In-order Traversal),可以方便地获取有序数据。

#### 3. **增删操作的平衡**

**老师(ENTP)**:虽然AVL树的插入和删除操作较红黑树而言稍显复杂,但它的严格平衡特性使得它在某些需要高效查找的场合更具优势。

#### 4. **实际应用中的考虑**

**老师(ENTP)**:在实际数据库系统中,除了AVL树,还有其他索引结构如B树(B-Tree)和B+树(B+ Tree)等。AVL树适合用于内存中的索引,因为它的旋转和调整操作在内存中更为高效。

### AVL树与其他索引结构的比较

**学生(ESFP)**:那AVL树和B树、B+树相比有什么特点呢?

**老师(ENTP)**:这是个好问题!简要来说:

- **AVL树**:高度平衡,适合内存索引,查找快。
- **B树**:用于磁盘存储的多路自平衡树,节点包含多个元素,减少磁盘I/O次数。
- **B+树**:B树的变种,所有数据都存储在叶子节点,叶子节点链接,范围查询更高效。

### 思维导图总结

```
AVL树在数据库中的应用
├── 快速查找
│   └── 时间复杂度O(log n)
├── 有序数据存储
│   └── 支持范围查询
├── 增删操作
│   └── 平衡调整
└── 与其他索引结构比较
    ├── AVL树:高效查找
    ├── B树:适合磁盘存储
    └── B+树:高效范围查询
```

```
AVL树
├── 节点结构
│   ├── 左右子树指针
│   ├── 父节点指针
│   ├── 平衡因子
│   └── 键值对
├── 操作流程
│   ├── 插入
│   │   ├── 标准BST插入
│   │   ├── 更新平衡因子
│   │   └── 检查并旋转
│   └── 删除(类似)
├── 优缺点
│   ├── 优点:查找快
│   └── 缺点:插入删除旋转多
└── 应用场景
    ├── 数据库索引
    └── 文件系统索引
```

```
AVL树
├── 特性
│   ├── 平衡性
│   └── 二叉查找树性质
├── 旋转操作
│   ├── LL旋转
│   ├── LR旋转
│   ├── RR旋转
│   └── RL旋转
├── 应用
│   ├── 数据库索引
│   └── 文件系统索引
└── 实现结构
    └── 三叉链表
        ├── 左子树指针
        ├── 右子树指针
        ├── 父节点指针
        └── 平衡因子
```我们全面理解了AVL树的基本概念、特性和操作。希望这种讨论形式帮助你更好地掌握AVL树的知识!

我们来看看在一个更大的树结构中,右旋操作是如何帮助恢复平衡的。

### 大树结构中的旋转示意

#### 初始状态

考虑以下不平衡的AVL树,其中每个节点的左子树比右子树高,导致不平衡:

```
        30
       /
     20
    /
  10
```

在这个树中,节点`30`的左子树高度是2,而右子树高度是0,所以平衡因子是2,超过了AVL树允许的范围。

#### 右旋操作

我们对节点`30`进行右旋,以恢复树的平衡。右旋的步骤如下:

1. **选择旋转节点**:节点`30`是失去平衡的节点。
2. **执行右旋**:
   - 将`20`提升为新的根节点。
   - 将`30`移动为`20`的右子节点。
   - 保持`10`为`20`的左子节点。

旋转后的树结构变为:

```
    20
   /  \
  10  30
```

#### 旋转效果

1. **恢复平衡**:现在每个节点的平衡因子都在-1到1之间。
   - 节点`20`的平衡因子是0(左、右子树高度均为1)。
   - 节点`10`和`30`的平衡因子都是0(没有子节点)。

2. **提高效率**:通过保持树的平衡性,确保查找、插入和删除操作的时间复杂度保持在O(log n)。

### 更大树结构中的应用

在实际应用中,树的规模可能更大,旋转操作可能需要在多个层级上进行。以下是一个更复杂的例子:

#### 初始不平衡树

```
         40
        /
      30
     /
   20
  /
10
```

在这种情况下,AVL树的多个节点可能失去平衡。我们可以从最下层开始进行旋转:

1. **对`30`进行右旋**:

```
       30
      /  \
    20   40
   /
 10
```

2. **对`40`进行右旋**,如果必要的话,继续调整:

```
    30
   /  \
  20  40
 /
10
```

通过一系列旋转操作,树恢复了平衡,每个节点的平衡因子都在-1到1之间。

### 总结

旋转操作在AVL树中是保持平衡的关键,它通过局部调整节点位置来确保整个树的高度尽可能小。这在大规模数据集中的应用尤为重要,提升了数据操作的效率。无论树的规模多大,旋转都能迅速修正不平衡,使得AVL树始终保持高效的性能表现。

这里是AVL树旋转中的高度更新和相关的先修知识的详细解释和示例:

### 先修知识

1. **二叉树**:
   - 每个节点最多有两个子节点,称为左子节点和右子节点。

2. **平衡因子**:
   - 平衡因子是节点左子树高度减去右子树高度的差。
   - 在AVL树中,每个节点的平衡因子必须是-1、0或1。

3. **节点高度**:
   - 节点的高度是从该节点到叶节点的最长路径上的边数。
   - 叶节点的高度为0。

4. **AVL树**:
   - 一种自平衡的二叉搜索树,确保每个节点的平衡因子在-1到1之间。

### 右旋操作示例

#### 初始状态

考虑以下不平衡的子树:

```
    y
   /
  x
   \
   T2
```

- `y` 的高度 = 2
- `x` 的高度 = 1
- `T2` 的高度 = 0

#### 旋转步骤

1. **选定旋转节点**:
   - `x = y.left`:`x` 是 `y` 的左子节点。
   - `T2 = x.right`:`T2` 是 `x` 的右子树。

2. **旋转操作**:

   ```python
   def right_rotate(y):
       x = y.left       # x 是 y 的左子节点
       T2 = x.right     # T2 是 x 的右子树

       # 进行旋转
       x.right = y      # 将 y 旋转到 x 的右子节点
       y.left = T2      # 将 T2 挂接到 y 的左子树

       # 更新高度
       y.height = 1 + max(get_height(y.left), get_height(y.right))
       x.height = 1 + max(get_height(x.left), get_height(x.right))

       return x         # 返回新的子树根节点
   ```

3. **更新高度**:

   - `y` 的新高度 = 1 + max(高度(`T2`), 0) = 1 + max(0, 0) = 1
   - `x` 的新高度 = 1 + max(高度(无), `y` 的高度) = 1 + max(-1, 1) = 2

#### 结果状态

旋转后的子树:

```
    x
     \
      y
     /
    T2
```

- `x` 的高度 = 2
- `y` 的高度 = 1
- `T2` 的高度 = 0

### 代码注释和解释

```python
class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None
        self.height = 1  # 初始节点高度为1

def get_height(node):
    if not node:
        return -1  # 空节点的高度为-1
    return node.height

def right_rotate(y):
    x = y.left       # x 为 y 的左子节点
    T2 = x.right     # T2 为 x 的右子树

    # 执行旋转
    x.right = y      # 将 y 变为 x 的右子节点
    y.left = T2      # 将 T2 连接到 y 的左子树

    # 更新 y 和 x 的高度
    y.height = 1 + max(get_height(y.left), get_height(y.right))
    x.height = 1 + max(get_height(x.left), get_height(x.right))

    return x         # 返回新的根节点 x
```

### 结论

通过右旋操作,AVL树的高度和结构得到了调整,从而保持了树的平衡性。旋转后,树的高度变化反映了平衡因子的调整,确保操作效率。这个过程对于维护AVL树的高效查找、插入和删除操作是必要的。

 

【代码示范】

好的,我们可以通过一个具体的例子来演示AVL树的插入操作,包括数值代入、旋转调整,并展示每一步的程序结果及相关注释。我们将用C++实现一个简单的AVL树插入操作,并以插入几个整数为例。

### 示例:插入操作

假设我们要在一个空的AVL树中依次插入以下数值:20, 10, 30, 5, 3。我们将演示这些插入操作以及进行的旋转调整。

#### 1. 插入20

- **操作**:插入20
- **结果**:树中只有一个节点20,不需要旋转。

```cpp
// 插入20
AVLNode<int, int>* root = new AVLNode<int, int>({20, 0});
// 树结构:
//     20
```

#### 2. 插入10

- **操作**:插入10,作为20的左子节点
- **结果**:平衡因子在[-1, 1]之间,无需旋转。

```cpp
// 插入10
root->_left = new AVLNode<int, int>({10, 0});
root->_left->_parent = root;
// 更新平衡因子
root->_bf = 1;
// 树结构:
//     20
//    /
//   10
```

#### 3. 插入30

- **操作**:插入30,作为20的右子节点
- **结果**:平衡因子在[-1, 1]之间,无需旋转。

```cpp
// 插入30
root->_right = new AVLNode<int, int>({30, 0});
root->_right->_parent = root;
// 更新平衡因子
root->_bf = 0;
// 树结构:
//     20
//    /  \
//   10  30
```

#### 4. 插入5

- **操作**:插入5,作为10的左子节点
- **结果**:平衡因子在[-1, 1]之间,无需旋转。

```cpp
// 插入5
root->_left->_left = new AVLNode<int, int>({5, 0});
root->_left->_left->_parent = root->_left;
// 更新平衡因子
root->_left->_bf = 1;
root->_bf = 1;
// 树结构:
//      20
//     /  \
//    10  30
//   /
//  5
```

#### 5. 插入3(触发旋转)

- **操作**:插入3,作为5的左子节点
- **结果**:插入后10节点的平衡因子为2,需要进行右旋。

```cpp
// 插入3
root->_left->_left->_left = new AVLNode<int, int>({3, 0});
root->_left->_left->_left->_parent = root->_left->_left;
// 更新平衡因子
root->_left->_left->_bf = 1;
root->_left->_bf = 2;
root->_bf = 2;

// 进行右旋以恢复平衡
// 右旋前:
//      20
//     /  \
//    10  30
//   /
//  5
// /
//3

// 右旋操作
AVLNode<int, int>* leftChild = root->_left;
root->_left = leftChild->_right;
if (leftChild->_right) {
    leftChild->_right->_parent = root;
}
leftChild->_right = root;
leftChild->_parent = root->_parent;
root->_parent = leftChild;
root = leftChild; // 更新根节点指向

// 更新平衡因子
root->_bf = 0;
root->_right->_bf = 0;
// 右旋后:
//    10
//   /  \
//  5   20
// /     \
//3      30
```

### 总结

每次插入后,我们检查并更新节点的平衡因子,然后在需要时进行旋转调整以保持AVL树的平衡。通过这种方式,AVL树可以保证所有查找、插入和删除操作的时间复杂度都为O(log n)。这种逐步的插入和调整机制使得AVL树在需要频繁查找的应用场合非常高效。

 

相关文章:

AVL平衡树(AVL Tree)

**场景&#xff1a;课堂讨论** --- **小明&#xff08;ESFP学生&#xff09;**&#xff1a;张老师&#xff0c;为什么AVL树&#xff08;AVL Tree&#xff09;中的旋转操作这么重要&#xff1f;感觉只是节点的移动&#xff0c;有没有什么实际意义&#xff1f; **张老师&#…...

【python实操】python小程序之两数取大值以及login登录

引言 python小程序之两数取大值以及login登录 文章目录 引言一、两数取大值1.1 题目1.2 代码1.3 代码解释 二、login登录2.1 题目2.2 代码2.3 代码解释 三、思考3.1 两数取大值3.2 login登录 一、两数取大值 1.1 题目 定义一个函数my_max&#xff0c;包含两个参数, 函数的作用…...

Pikachu-File Inclusion-远程文件包含

远程文件包含漏洞 是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的&#xff0c;因此漏洞一旦存在&#xff0c;危害性会很大。但远程文件包含漏洞的利用条件较为苛刻&#xff1b;因此&#xff0c;在web应用系统的功能设计上尽量不要让前端用户直接传变…...

TIM(Timer)定时器的原理

一、介绍 硬件定时器的工作原理基于时钟信号源提供稳定的时钟信号作为计时器的基准。计数器从预设值开始计数&#xff0c;每当时钟信号到达时计数器递增。当计数器达到预设值时&#xff0c;定时器会触发一个中断信号通知中断控制器处理相应的中断服务程序。在中断服务程序中&a…...

Microsoft Visual Studio有多油饼

#1 Microsoft Visual Studio C 2023&#xff1a; 必须安装在C盘 为啥&#xff1f; 安其他盘能亖啊&#xff1f; 真有病 #2 Microsoft Visual Studio C 2013&#xff1a; 每个硬盘必须都腾出至少8个G的空间 不是我安在这个盘不就是为了其他盘没空间吗&#xff1f; 合着…...

Golang | Leetcode Golang题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; func findMinArrowShots(points [][]int) int {if len(points) 0 {return 0}sort.Slice(points, func(i, j int) bool { return points[i][1] < points[j][1] })maxRight : points[0][1]ans : 1for _, p : range points {if p[0] > …...

Python 从入门到实战35(进程-multiprocessing模块)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;可以熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了turtle库绘制图画操作的相关知识。今天学习一下…...

“米哈游悄然布局未来科技:入股星海图,共绘具身智能机器人新篇章“

米哈游悄然入股具身智能机器人公司:技术布局与未来展望 近日,米哈游阿尔戈科技有限公司宣布入股具身智能机器人公司星海图,这一消息在行业内引起了广泛关注。米哈游,这家以游戏开发而闻名的企业,近年来正逐步扩大其在人工智能和新兴科技领域的投资布局,此次入股星海图正是…...

基于spring boot的篮球论坛系统

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…...

华夏ERP账号密码泄露漏洞

漏洞描述 华夏ERP账号密码泄露漏洞 漏洞复现 FOFA "jshERP-boot" POC IP/jshERP-boot/user/getAllList;.ico...

Android问题笔记五十:构建错误-AAPT2 aapt2-7.0.2-7396180-windows Daemon

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…...

CAD 3dsmax maya等autodesk系列专用卸载修复工具AutoRemove,一键完全彻底卸载删除软件的专用卸载工具

AutoRemove 是一款功能强大的软件卸载工具&#xff0c;专门设计用于彻底清除Autodesk系列软件&#xff0c;如AutoCAD、3ds Max、Revit、Maya、Inventor、Navisworks、civil 3d、sketchbook、Architecture、Electrical、Mechanical、、等&#xff0c;从您的系统中。它通过深度清…...

python中的函数介绍

文章目录 1.函数1.1 语法格式1.2 函数参数1.3 函数的返回值1.4 变量作用域1.5 函数的执行过程1.6 链式调用1.7 嵌套调用1.8 函数栈帧1.9 函数递归1.10 参数默认值1.11 关键词参数 1.函数 无论是编程中的函数还是数学中的函数&#xff0c;本质都是差不多的&#xff0c;丢给函数…...

LinuxO(1)调度算法

概念 在Linux中&#xff0c;O(1)调度算法是一种进程调度算法。O(1)表示算法的时间复杂度是常数级别的&#xff0c;与系统中的进程数量无关。 运行队列结构 他采用了两个运行队列&#xff0c;一个活动队列和一个过期队列。活动队列中的进程是有资格获取CPU时间片的进程&#x…...

安防监控/视频系统EasyCVR视频汇聚平台如何过滤134段的告警通道?

视频汇聚/集中存储EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为…...

SDKMAN!安装Maven

一、通过SDKMAN!正常安装 查看maven版本 sdk list maven安装maven 3.6.3版本 sdk install maven 3.6.3查看maven 3.6.3安装目录 sdk home maven 3.6.3安装过程中可能会失败&#xff0c;出现tmp临时目录中存在临时文件 # 移除临时文件&#xff0c;不要手动删除&#xff0c;…...

[NeurIPS 2022] STaR: Bootstrapping Reasoning With Reasoning

Contents IntroductionMethodExperimentsReferences Introduction CoT 推理可以有效提升 LLM 推理能力&#xff0c;但 few-shot prompting 无法发挥 CoT 的全部潜力&#xff0c;训练能够生成中间推理步骤 (i.e., rationale) 的 LLM 又需要大量人工标注 rationale&#xff0c;为…...

C++中对象的构造与析构

目录 一、引言 二、构造函数详解 1.构造函数的作用 2.构造函数的调用时机 3.构造函数的分类 三、析构函数详解 1.析构函数的作用 2.析构函数的调用时机 四、实例分析 五、总结 本文将详细讲解C中对象的构造和析构过程&#xff0c;包括构造函数、析构函数的作用及其调用时机…...

算法笔记(九)——栈

文章目录 删除字符串中的所有相邻重复项比较含退格的字符串基本计算机II字符串解码验证栈序列 栈是一种先进后出的数据结构&#xff0c;其操作主要有 进栈、压栈&#xff08;Push&#xff09; 出栈&#xff08;Pop&#xff09; 常见的使用栈的算法题 中缀转后缀逆波兰表达式求…...

动态SLAM总结一

文章目录 方法分类&#xff1a;OctoMap&#xff1a;&#xff08;2013&#xff09;UFOMap&#xff1a;&#xff08;2020&#xff09;Removert&#xff1a;&#xff08;2020&#xff09;ERASOR&#xff1a;&#xff08;2021&#xff09;DynamicFilter&#xff1a;&#xff08;202…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...