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

算法和程序的区别

算法(Algorithm)和程序(Program)是计算机科学中两个密切相关但不同的概念。让我们通过以下几个方面来比较它们:

### 1. 设计 vs 实现

- **算法设计(Algorithm Design)**:
  - **定义**:算法设计涉及解决问题的步骤和方案。设计过程关注逻辑和步骤的有效性与效率。
  - **特点**:通常是语言无关的,可以用伪代码或流程图表示。
  - **例子**:设计一个排序算法,比如快速排序(Quicksort),定义它的步骤:选择基准、分区、递归排序。

- **程序实现(Program Implementation)**:
  - **定义**:程序实现是将算法转化为具体的代码,利用编程语言实现算法的逻辑。
  - **特点**:与具体的编程语言相关,需要考虑语法、数据结构、库函数等。
  - **例子**:用C++实现快速排序算法,需要编写函数,处理数组和指针,使用语言特性优化性能。

### 2. 领域知识 vs 编程知识

- **领域知识(Domain Knowledge)**:
  - **定义**:领域知识是指对特定应用领域的深入了解,帮助在该领域识别问题和设计算法。
  - **特点**:涉及业务逻辑、行业标准、特定需求。
  - **例子**:在金融领域,理解股票市场的运作,可以设计出预测市场趋势的算法。

- **编程知识(Programming Knowledge)**:
  - **定义**:编程知识指的是对编程语言、工具和技术的掌握,用于实现算法和解决实际问题。
  - **特点**:包括语法、数据结构、算法、调试、优化等。
  - **例子**:熟悉Python语言特性,能够使用其丰富的库快速实现数据处理算法。

### 3. 分析 vs 测试

- **算法分析(Algorithm Analysis)**:
  - **定义**:算法分析是评估算法的性能,包括时间复杂度和空间复杂度。
  - **特点**:通常在实现前进行,以选择最优算法。
  - **例子**:分析不同排序算法(如快速排序、归并排序)的复杂度,选择合适的算法。

- **程序测试(Program Testing)**:
  - **定义**:程序测试是验证程序的正确性和可靠性,通常在实现后进行。
  - **特点**:包括单元测试、集成测试、系统测试等。
  - **例子**:针对一个排序程序,编写测试用例,验证其在各种输入下的正确性和性能。

### 4. 任意语言 vs 编程语言

- **任意语言描述(Any Language Description)**:
  - **定义**:算法可以用任意语言描述,包括自然语言、伪代码、流程图。
  - **特点**:强调逻辑清晰、易于理解和交流。
  - **例子**:用伪代码描述一个算法,以便不受特定编程语言限制。

- **编程语言(Programming Language)**:
  - **定义**:编程语言是用于编写程序的正式语言,具有特定的语法和语义。
  - **特点**:需要遵循严格的语法规则,支持程序的编译和执行。
  - **例子**:用C++、Python、Java等编程语言实现具体的程序。

### 总结

通过算法和程序的对比,我们可以看出,算法关注的是解决问题的策略和理论基础,而程序关注的是如何利用编程语言将这些策略付诸实践。两者的结合是计算机科学中解决问题的核心。以下是一个简单的思维导图总结:

1. **算法**
   - 设计
   - 领域知识
   - 分析
   - 任意语言描述

2. **程序**
   - 实现
   - 编程知识
   - 测试
   - 编程语言

### 课堂讨论:算法与程序的探究

**学生小明(INTJ):** 老师,我一直在思考,为什么我们在学习编程时,总是先讲算法再讲程序实现?这两者的关系到底是怎样的呢?🤔

**老师(ENTP):** 小明,这是个好问题!算法和程序就像是设计图和建筑物。算法是解决问题的步骤和策略,而程序是这些步骤的具体实现。让我用几个例子来说明吧。

#### 例子1:排序问题

**老师:** 先来说说排序。假设我们有一堆无序的数字,我们想把它们排列成有序的。算法就像是我们设计的一种排序策略,比如快速排序(Quicksort)。这个算法大致步骤是:选择一个基准数,把数组分成两部分,一部分比基准数小,一部分比基准数大,然后递归地对两部分进行排序。

**学生小明:** 所以,算法就是我们要怎么做的计划?

**老师:** 没错!👏 然后程序实现就是用代码把这个算法实现出来。比如,用C++写快速排序:

让我们逐步演示如何使用快速排序算法对一个数组进行排序。为了完整地理解这个过程,我们需要定义 `partition` 函数,因为它是快速排序的核心部分。

### 假设的 `partition` 函数

在这个示例中,我们假设 `partition` 函数选择数组的最后一个元素作为基准,并将数组分区,使得基准左边的元素都小于基准,右边的元素都大于基准。

```cpp
int partition(int array[], int low, int high) {
    int pivot = array[high]; // 选择最后一个元素作为基准
    int i = low - 1; // i是较小元素的索引

    for (int j = low; j < high; j++) {
        if (array[j] < pivot) {
            i++;
            swap(array[i], array[j]); // 交换元素
        }
    }
    swap(array[i + 1], array[high]); // 把基准放到正确的位置
    return i + 1; // 返回基准的索引
}
```

### 示例数组

假设我们有一个数组 `[10, 7, 8, 9, 1, 5]`,我们将使用快速排序进行排序。

### 快速排序的步骤

1. **初始调用**
   ```cpp
   quicksort(array, 0, 5);
   ```

   - `low = 0`, `high = 5`
   - 数组为 `[10, 7, 8, 9, 1, 5]`

2. **第一次分区**
   - 基准 = `5`
   - 执行 `partition(array, 0, 5)`

   **分区过程**:
   - 初始化 `i = -1`
   - 遍历 `j` 从 `0` 到 `4`:
     - `j = 0`: `array[0] = 10` > `5`,不交换
     - `j = 1`: `array[1] = 7` > `5`,不交换
     - `j = 2`: `array[2] = 8` > `5`,不交换
     - `j = 3`: `array[3] = 9` > `5`,不交换
     - `j = 4`: `array[4] = 1` < `5`,`i++`,交换 `array[0]` 和 `array[4]`,得到 `[1, 7, 8, 9, 10, 5]`
   - 交换 `array[i + 1]` 和 `array[5]`(`5`),得到 `[1, 5, 8, 9, 10, 7]`
   - 返回 `pi = 1`

3. **递归调用左侧子数组**
   ```cpp
   quicksort(array, 0, 0);
   ```
   - 子数组 `[1]`,无需排序

4. **递归调用右侧子数组**
   ```cpp
   quicksort(array, 2, 5);
   ```
   - `low = 2`, `high = 5`
   - 子数组为 `[8, 9, 10, 7]`

5. **第二次分区**
   - 基准 = `7`
   - 执行 `partition(array, 2, 5)`

   **分区过程**:
   - 初始化 `i = 1`
   - 遍历 `j` 从 `2` 到 `4`:
     - `j = 2`: `array[2] = 8` > `7`,不交换
     - `j = 3`: `array[3] = 9` > `7`,不交换
     - `j = 4`: `array[4] = 10` > `7`,不交换
   - 交换 `array[i + 1]` 和 `array[5]`(`7`),得到 `[1, 5, 7, 9, 10, 8]`
   - 返回 `pi = 2`

6. **递归调用右侧子数组**
   ```cpp
   quicksort(array, 3, 5);
   ```
   - `low = 3`, `high = 5`
   - 子数组为 `[9, 10, 8]`

7. **第三次分区**
   - 基准 = `8`
   - 执行 `partition(array, 3, 5)`

   **分区过程**:
   - 初始化 `i = 2`
   - 遍历 `j` 从 `3` 到 `4`:
     - `j = 3`: `array[3] = 9` > `8`,不交换
     - `j = 4`: `array[4] = 10` > `8`,不交换
   - 交换 `array[i + 1]` 和 `array[5]`(`8`),得到 `[1, 5, 7, 8, 10, 9]`
   - 返回 `pi = 3`

8. **继续递归调用**

   - 调用 `quicksort(array, 3, 2)`,子数组为空,无需排序。
   - 调用 `quicksort(array, 4, 5)`,子数组为 `[10, 9]`

9. **第四次分区**
   - 基准 = `9`
   - 执行 `partition(array, 4, 5)`

   **分区过程**:
   - 初始化 `i = 3`
   - 遍历 `j` 从 `4` 到 `4`:
     - `j = 4`: `array[4] = 10` > `9`,不交换
   - 交换 `array[i + 1]` 和 `array[5]`(`9`),得到 `[1, 5, 7, 8, 9, 10]`
   - 返回 `pi = 4`

10. **最后递归调用**

    - 调用 `quicksort(array, 4, 3)` 和 `quicksort(array, 5, 5)`,两者子数组均为空或单元素,无需排序。

### 最终结果

经过以上步骤,数组被成功排序为 `[1, 5, 7, 8, 9, 10]`。快速排序通过不断地分区和递归,最终将所有元素排序到正确的位置。这个过程充分利用了分治策略,使得算法在平均情况下具有非常高效的性能。

**老师:** 这里,`quicksort`函数就是我们用来实现这个算法的代码。通过递归调用,我们实现了快速排序的逻辑。

【快速排序算法 -  CSDN App】https://blog.csdn.net/cocofu/article/details/143816373?sharetype=blogdetail&shareId=143816373&sharerefer=APP&sharesource=cocofu&sharefrom=link

#### 例子2:路径规划

**老师:** 再来看一个复杂一点的例子:路径规划。在导航系统中,我们需要找到从起点到终点的最短路径。这个时候,我们可以使用Dijkstra算法。

**学生小明:** 听起来像是一个图论问题?🤔

**老师:** 没错!Dijkstra算法就是用来解决这个问题的算法。它通过逐步扩展已知最短路径的顶点集来找到最短路径。程序实现时,我们可能会用优先队列来优化操作。

```cpp
void dijkstra(vector<vector<int>>& graph, int src) {
    int V = graph.size();
    vector<int> dist(V, INT_MAX);
    dist[src] = 0;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, src});

    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();
        for (const auto& [v, weight] : graph[u]) {
            if (dist[u] + weight < dist[v]) {
                dist[v] = dist[u] + weight;
                pq.push({dist[v], v});
            }
        }
    }
}
```

**学生小明:** 这样看来,算法是理论,程序是实践!😄

#### 例子3:数据压缩

**老师:** 最后一个例子,数据压缩。比如我们需要压缩一段文本,霍夫曼编码(Huffman Coding)是一个经典的算法。

**学生小明:** 我知道,这是用来减少数据占用空间的,对吧?

**老师:** 对!霍夫曼编码通过构建一棵二叉树来实现最优前缀编码,从而达到压缩的目的。程序实现时,我们用优先队列来构建这棵树。

```cpp
struct Node {
    char data;
    int freq;
    Node *left, *right;
    Node(char data, int freq) : data(data), freq(freq), left(nullptr), right(nullptr) {}
};

Node* buildHuffmanTree(const string& text) {
    unordered_map<char, int> freq;
    for (char c : text) freq[c]++;
    priority_queue<Node*, vector<Node*>, Compare> pq;
    for (auto& [ch, fr] : freq) {
        pq.push(new Node(ch, fr));
    }
    while (pq.size() > 1) {
        Node* left = pq.top(); pq.pop();
        Node* right = pq.top(); pq.pop();
        Node* top = new Node('$', left->freq + right->freq);
        top->left = left;
        top->right = right;
        pq.push(top);
    }
    return pq.top();
}
```

**学生小明:** 听起来像是把抽象的算法变成具体的代码过程。😮

**老师:** 没错!所以,算法是我们解决问题的策略,而程序是我们实现这些策略的工具。理解两者的关系,能让你成为更优秀的程序员!记住:理论与实践相结合,才能更好地解决实际问题。

**学生小明:** 谢谢老师!我明白了,算法和程序就像设计图和建筑物,缺一不可!😊

**老师:** 很好!继续保持这种思考和探索的精神。学习编程不仅是学会写代码,更是学会分析和解决问题。💪
 

### 技术探险:从算法设计到程序实现

在一个充满科技气息的咖啡馆里,程序员小明正品味着他的拿铁。他的笔记本电脑屏幕上闪烁着代码和流程图,他正在思考一个关于算法与程序的复杂问题。小明是一个充满好奇心和活力的程序员,他喜欢从不同的角度分析和解决问题。

#### 第一幕:算法的启发

这一天,小明接到了一个新项目:帮助一家在线零售公司优化他们的库存管理系统。这个系统需要能够快速准确地预测哪些商品需要补货,以避免缺货或过量库存。

小明知道,这需要设计一个高效的库存预测算法。他在笔记本上开始勾勒:

- **需求分析**:了解库存管理的业务逻辑,需要考虑销售历史数据、季节性变化和市场趋势等因素。
- **算法选择**:小明考虑使用一种机器学习算法,比如线性回归(Linear Regression),因为它擅长处理连续数据,可以预测未来趋势。

小明在笔记本上写下伪代码:

```
输入:历史销售数据
输出:未来一周的销售预测

步骤:
1. 收集并清理数据
2. 为数据集添加日期特征
3. 使用线性回归模型训练数据
4. 根据模型预测未来销售量
```

#### 第二幕:程序的实现

有了算法设计,小明接下来需要将其转化为具体的程序。他选择了Python作为实现语言,因为它的库丰富,支持快速开发。

```python
import pandas as pd
from sklearn.linear_model import LinearRegression
import numpy as np

# 第一步:收集并清理数据
data = pd.read_csv('sales_data.csv')
data['date'] = pd.to_datetime(data['date'])
data = data.sort_values('date')

# 第二步:为数据集添加日期特征
data['day_of_week'] = data['date'].dt.dayofweek
data['month'] = data['date'].dt.month

# 第三步:使用线性回归模型训练数据
X = data[['day_of_week', 'month']]
y = data['sales']

model = LinearRegression()
model.fit(X, y)

# 第四步:根据模型预测未来销售量
future_dates = pd.DataFrame({
    'day_of_week': [0, 1, 2, 3, 4, 5, 6],
    'month': [11, 11, 11, 11, 11, 11, 11]
})
predictions = model.predict(future_dates)
print("未来一周的销售预测:", predictions)
```

小明一边编写代码,一边测试程序。他细致地调试每一个步骤,确保程序能够正确运行。

#### 第三幕:思辨与反思

在程序成功运行后,小明深深地思考着算法与程序之间的关系。他意识到:

- **算法设计**是解决问题的基础,它决定了程序的逻辑框架和核心功能。
- **程序实现**则是将算法付诸实践的关键,通过编程语言将抽象的算法转化为可执行的代码。
- 他还认识到,**领域知识**在算法设计中至关重要,而**编程知识**则在程序实现中不可或缺。

小明意识到,算法与程序的完美结合才能创造出高效、可靠的系统。通过这次项目,他不仅提升了自己的技术能力,也更加理解了两者之间的微妙关系。

这次经历让小明更加热爱他的工作。他决定在他的博客上分享这次项目的心得,希望能帮助更多的程序员理解算法与程序的奥秘。他相信,技术的力量在于分享与交流,每一次深入的探讨都是成长的一步。

### 结尾

小明的故事告诉我们,程序员的工作不仅仅是编写代码,更是通过算法设计和程序实现去解决实际问题的过程。在这个过程中,思考与实践同样重要,每一个细节都值得我们用心去探索。每一次代码的编写都是一次新的冒险,而我们,正是这场技术探险的领航者。

 

 

相关文章:

算法和程序的区别

算法&#xff08;Algorithm&#xff09;和程序&#xff08;Program&#xff09;是计算机科学中两个密切相关但不同的概念。让我们通过以下几个方面来比较它们&#xff1a; ### 1. 设计 vs 实现 - **算法设计&#xff08;Algorithm Design&#xff09;**&#xff1a; - **定…...

用指针遍历数组

#include<stdio.h> int main() {//定义一个二维数组int arr[3][4] {{1,2,3,4},{2,3,4,5},{3,4,5,6},};//获取二维数组的指针int (*p)[4] arr;//二维数组里存的是一维数组int[4]for (int i 0; i < 3; i){//遍历一维数组for (int j 0; j <4; j){printf("%d &…...

《Probing the 3D Awareness of Visual Foundation Models》论文解析——多视图一致性

一、论文简介 论文讨论了大规模预训练产生的视觉基础模型在处理任意图像时的强大能力&#xff0c;这些模型不仅能够完成训练任务&#xff0c;其中间表示还对其他视觉任务&#xff08;如检测和分割&#xff09;有用。研究者们提出了一个问题&#xff1a;这些模型是否能够表示物体…...

使用pip安装esp32的擦除、写入固件的esptool库

esptool库可以为esp32的开发板烧录新的固件&#xff0c;但是如果为了烧录固件就要装esp-idf软件包&#xff0c;甚至需要用make编译安装很久&#xff0c;实在太费时费力了&#xff01; 好消息就是&#xff0c;esp提供了python的esptool库&#xff0c;这样只要使用pip安装上这个…...

传奇996_23——杀怪掉落,自动捡取,捡取动画

一、杀怪掉落 前置&#xff1a; 添加地图地图刷怪怪物掉落&#xff08;术语叫爆率&#xff0c;掉落叫爆率&#xff0c;而且文档上叫爆率&#xff09; 刷怪步骤&#xff1a;在\MirServer\Mir200\Envir\MonItems文件夹中建立以怪物名字为文件名的txt文件写法案例&#xff1a; …...

【030】基于51单片机甲醛检测报警器【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成&#xff1a;51单片机最小系统 ZE08-CH2O甲醛传感器AT24C02存储芯片LCD1602液晶显示按键设置蜂鸣器报警。 1、本设计采用STC89C52、AT89C52、AT89S52作为主控芯片&#xff1b; 2、采用ZE08-CH2O甲醛传感器采集环境中的甲醛浓度值&#xff0c;LCD1602实时显示…...

微信小程序:vant组件库安装步骤

前言&#xff1a;在微信小程序中引用vant组件报错&#xff0c;提示路径不存在&#xff0c;这很有可能是因为没有安装构建vant组件库导致。下面是我整理的安装vant组件库的步骤: 第一步&#xff1a;安装node.js(执行完第一步请重启小程序) 具体步骤请看链接&#xff1a;node.js…...

处理namespace问题:Namespace not specified for AGP 8.0.0

How do I fix ‘namespace not specified’ error in Android Studio? Namespace not specified for AGP 8.0.0 解决方案 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/androi…...

C++(Qt)软件调试---内存分析工具Heob(26)

C(Qt)软件调试—内存分析工具Heob&#xff08;26&#xff09; 文章目录 C(Qt)软件调试---内存分析工具Heob&#xff08;26&#xff09;[toc]1、概述&#x1f41c;2、环境配置&#x1fab2;3、功能说明4、使用Heob分析qt 程序内存泄漏&#x1f9a7;5、使用Heob检测qt 程序野指针…...

Redis五大基本类型——String字符串命令详解(命令用法详解+思维导图详解)

目录 一、String字符串类型介绍 二、常见命令 1、SET 2、GET 3、MGET 4、MSET 使用MGET 和 使用多次GET的区别 5、DEL 6、SETNX SET、SET NX和SET XX执行流程 7、INCR 8、INCRBY 9、DECR 10、DECYBY 11、INCRBYFLOAT 12、APPEND 13、GETRANGE 14、SETRANGE …...

Flutter中的Material Theme完全指南:从入门到实战

Flutter作为一款热门的跨平台开发框架&#xff0c;其UI组件库Material Design深受开发者喜爱。本文将深入探讨Flutter Material Theme的使用&#xff0c;包括如何借助Material Theme Builder创建符合产品需求的主题风格。通过多个场景和代码实例&#xff0c;让你轻松掌握这一工…...

Python 第三方库 PyQt5 的安装

目录 前言 PyQt5安装 不同操作系统PyQt5安装 一、Windows 系统 二、macOS 系统 三、Linux 系统&#xff08;以 Ubuntu 为例&#xff09; 安装 PyQt5 可能会遇到的问题 一、环境相关问题 二、依赖问题 三、网络问题 四、安装工具问题 五、运行时问题 六、环境配置问…...

CSS基础也要进行模电实验

盒子阴影 圆角边框已经介绍过哩&#xff0c;现在先介绍一下盒子阴影的效果如何实现 CSS3中新增了盒子阴影&#xff0c;可以使用box-shadow属性为盒子添加阴影 这是固定的语法&#xff1a; text-shadow: h-shadow v-shadow blur color; 它有这些可选的值&#xff1a; 哦。 …...

贴代码框架PasteForm特性介绍之markdown和richtext

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…...

3D Gaussian Splatting 代码层理解之Part3

最后,内容到达了高斯泼溅过程中最有趣的阶段:渲染!这一步可以说是最关键的,因为它决定了模型的真实性。然而,它也可能是最简单的。在本系列的Part 1和Part2,文章演示了如何将 Raw 3D椭球 转换为可渲染的格式,但现在我们实际上必须完成这项工作并渲染到一组固定的像素上。…...

Ceph 中PG与PGP的概述

在Ceph分布式存储系统中&#xff0c;PG&#xff08;Placement Group&#xff09;和PGP&#xff08;Placement Group for Placement purpose&#xff09;是两个至关重要的概念&#xff0c;它们共同决定了数据在集群中的分布和复制方式。以下是关于Ceph中PG和PGP关系的详细解释&a…...

已解决:spark代码中sqlContext.createDataframe空指针异常

这段代码是使用local模式运行spark代码。但是在获取了spark.sqlContext之后&#xff0c;用sqlContext将rdd算子转换为Dataframe的时候报错空指针异常 Exception in thread "main" org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.lang.Nu…...

flutter字体大小切换案例 小字体,标准字体,大字体,超大字体案例

flutter字体大小切换案例 小字体&#xff0c;标准字体&#xff0c;大字体&#xff0c;超大字体案例 Android iOS设备带有选择记录 我的flutter项目版本 environment: sdk: ‘>3.4.4 <4.0.0’ 图片案例 pubspec.yaml 添加依赖 # 屏幕尺寸适配 https://github.com/OpenF…...

智慧建造-运用Trimble技术将梦幻水族馆变为现实【上海沪敖3D】

项目概述 西雅图水族馆耗资1.6亿美元对海洋馆进行扩建。该项目包括建造三个大型栖息地&#xff0c;每个建筑物几乎都没有直边&#xff0c;其中一个主栖息地由520立方米混凝土和355吨钢筋组成。特纳建筑公司的混凝土团队通过强大的贸易合作伙伴和创新的数字制造技术&#xff0c;…...

【NOIP提高组】计算系数

【NOIP提高组】计算系数 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给定一个多项式 (ax by)^k &#xff0c;请求出多项式展开后 x^n y^m 项的系数。 输入 共一行&#xff0c;包含 5 个整数&#x…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...