《线性表、顺序表与链表》教案(C语言版本)
🌟 各位看官好,我是maomi_9526!
🌍 种一棵树最好是十年前,其次是现在!
🚀 今天来学习C语言的相关知识。
👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦
目录
教学目标
教学重点与难点
教学方法
教学大纲
1. 线性表(Linear List)
1. 线性表的定义
2. 线性表的基本特性
3. 线性表的常见实现方式
3.1 顺序存储(顺序表)
3.2 链式存储(链表)
4. 顺序表与链表的比较
5. 顺序表操作
6.链表基本操作
2. 顺序表(Sequence Table)
2.1 静态顺序表与动态顺序表
3. 顺序表 vs 链表
对比分析
课堂练习
作业设计
教学总结
教学目标
-
理解线性表的逻辑结构和物理实现方式。
-
掌握顺序表和链表的实现原理及核心操作。
-
能够通过代码实现顺序表和链表的基本功能。
-
分析顺序表与链表的性能差异及适用场景。
教学重点与难点
-
重点:顺序表的动态增容、链表的指针操作、时间复杂度分析。
-
难点:链表节点的插入与删除逻辑、顺序表与链表的性能权衡。
教学方法
-
理论讲解 + 代码演示 + 对比分析 + 课堂练习
教学大纲
1. 线性表(Linear List)
1. 线性表的定义
-
线性表:线性表是由n个具有相同特性的元素组成的有限序列,元素之间有明确的前后关系。每个元素有唯一的前驱和后继元素。线性表可以是顺序存储或链式存储。
-
逻辑结构:线性表是逻辑上的顺序排列,指的是元素之间的关系是依次排列的,每个元素都有一个明确的前后关系。
-
物理结构:线性表的元素在计算机内存中的存储方式,可以是连续的(顺序表)或者不连续的(链表)。
-
2. 线性表的基本特性
-
元素的顺序性:线性表中元素的顺序关系决定了元素之间的前后依赖关系,通常我们按从第一个元素到最后一个元素的顺序进行访问。
-
唯一性:每个元素在序列中有唯一的前驱和后继元素,只有第一个元素没有前驱,最后一个元素没有后继。
-
有限性:线性表包含一个有限的元素集合,且元素数量固定。
3. 线性表的常见实现方式
线性表有两种常见的物理存储方式:顺序存储和链式存储。
3.1 顺序存储(顺序表)
顺序存储使用一段连续的内存空间存储数据,通常使用数组来实现。数据元素在内存中的地址是连续的,因此可以通过索引来直接访问。
-
优点:
-
高效的随机访问:可以通过索引直接访问任意位置的元素,时间复杂度为 O(1)。
-
空间效率高:在内存中是连续存储,相对来说能够更高效地利用内存。
-
-
缺点:
-
插入和删除效率较低:在顺序表中间插入或删除元素时,需要移动大量的元素,时间复杂度为 O(N)。
-
固定容量问题:顺序表的容量一旦固定,后期无法动态调整空间,需要使用动态扩容,但扩容可能导致空间浪费。
-
3.2 链式存储(链表)
链表使用非连续的内存空间存储数据,每个元素包含一个数据域和一个指向下一个元素的指针(或者同时包含指向前后节点的指针),因此数据元素的地址不一定是连续的。
-
优点:
-
插入和删除效率高:链表只需要调整指针即可完成插入和删除操作,时间复杂度为 O(1)(不需要移动元素)。
-
动态内存分配:链表不需要预先定义大小,内存空间可以根据实际需求动态分配,避免了空间浪费问题。
-
-
缺点:
-
随机访问效率低:访问链表中的元素需要从头节点开始依次遍历,时间复杂度为 O(N)。
-
指针开销:每个节点需要额外的指针空间存储前驱或后继元素。
-
4. 顺序表与链表的比较
顺序表和链表是两种常见的线性表实现方式,它们的优缺点适用于不同的应用场景。
特性 | 顺序表 | 链表 |
---|---|---|
存储方式 | 使用连续的内存块(数组)存储元素 | 使用不连续的内存块(通过指针链接) |
随机访问 | O(1) | O(N) |
插入/删除操作 | O(N)(需要移动元素) | O(1)(只需修改指针) |
扩容/缩容 | 动态扩容(可能浪费空间) | 不需要扩容,按需分配空间 |
内存空间使用 | 存储空间固定,可能造成浪费 | 每个节点动态分配内存 |
应用场景 | 适合频繁访问的场景 | 适合频繁插入和删除的场景 |
内存开销 | 低,只有存储元素的数据 | 较高,每个节点还需要存储指针 |
5. 顺序表操作
-
初始化:创建一个顺序表,设定初始容量。
-
插入:将一个元素插入到指定位置,涉及移动元素。
-
删除:删除指定位置的元素,涉及移动元素。
-
查找:根据索引访问元素。
-
扩容:当顺序表的空间不足时,需要扩容并将现有数据复制到新数组中。
代码示例(插入与删除):
// 在位置index插入元素
void insert(DynamicArray* arr, int index, int value) {if (index < 0 || index > arr->size) {printf("Index out of bounds\n");return;}if (arr->size == arr->capacity) {resize(arr, 2 * arr->capacity);}// 元素后移for (int i = arr->size; i > index; i--) {arr->array[i] = arr->array[i - 1];}arr->array[index] = value;arr->size++;
}// 删除位置index的元素
void delete(DynamicArray* arr, int index) {if (index < 0 || index >= arr->size) {printf("Index out of bounds\n");return;}// 元素前移for (int i = index; i < arr->size - 1; i++) {arr->array[i] = arr->array[i + 1];}arr->size--;
}
6.链表基本操作
-
初始化:创建一个空链表,通常使用虚拟头节点(dummy node)来简化操作。
-
插入:在指定位置插入一个元素,修改指针链接。
-
删除:删除指定位置的元素,修改指针链接。
-
查找:遍历链表查找指定元素。
-
反转:将链表的元素顺序反转,调整指针的指向。
代码示例(单向链表):
#include <stdio.h>
#include <stdlib.h>struct ListNode {int val;struct ListNode* next;
};// 创建链表的头插法
struct ListNode* create_linked_list_head(int* values, int size) {struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));dummy->next = NULL;for (int i = 0; i < size; i++) {struct ListNode* new_node = (struct ListNode*)malloc(sizeof(struct ListNode));new_node->val = values[i];new_node->next = dummy->next;dummy->next = new_node;}return dummy->next;
}// 创建链表的尾插法
struct ListNode* create_linked_list_tail(int* values, int size) {struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* tail = dummy;for (int i = 0; i < size; i++) {struct ListNode* new_node = (struct ListNode*)malloc(sizeof(struct ListNode));new_node->val = values[i];tail->next = new_node;tail = tail->next;}return dummy->next;
}void print_linked_list(struct ListNode* head) {struct ListNode* current = head;while (current != NULL) {printf("%d ", current->val);current = current->next;}printf("\n");
}int main() {int values[] = {1, 2, 3};struct ListNode* head = create_linked_list_tail(values, 3);print_linked_list(head); // 输出:1 2 3return 0;
}
代码示例(反转链表、删除节点):
// 反转链表
struct ListNode* reverse_linked_list(struct ListNode* head) {struct ListNode* prev = NULL;struct ListNode* curr = head;while (curr != NULL) {struct ListNode* next_node = curr->next;curr->next = prev;prev = curr;curr = next_node;}return prev;
}// 删除链表中所有值为val的节点
struct ListNode* remove_elements(struct ListNode* head, int val) {struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));dummy->next = head;struct ListNode* current = dummy;while (current->next != NULL) {if (current->next->val == val) {struct ListNode* temp = current->next;current->next = temp->next;free(temp);} else {current = current->next;}}return dummy->next;
}
6.代码示例(C语言):
#include <stdio.h>#define MAX_SIZE 10// 顺序表(数组实现)
int linear_list[MAX_SIZE] = {1, 2, 3, 4, 5};// 链表(链式存储)
struct Node {int data;struct Node* next;
};void print_linear_list() {for (int i = 0; i < 5; i++) {printf("%d ", linear_list[i]);}printf("\n");
}void print_linked_list(struct Node* head) {struct Node* current = head;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}int main() {print_linear_list(); // 输出线性表return 0;
}
2. 顺序表(Sequence Table)
2.1 静态顺序表与动态顺序表
-
静态顺序表(Static Sequence Table):
-
定义:静态顺序表是使用固定大小的数组来存储数据元素。其大小在编译时就已经确定,运行时不能更改。
-
特点:
-
大小固定,一旦定义了数组的大小,就无法动态调整。
-
存储元素的内存地址在编译时就被分配好了,内存空间是连续的。
-
适合数据量已知并且不会频繁变化的场景。
-
-
优点:
-
存储效率高,访问元素的时间复杂度为O(1)。
-
-
缺点:
-
固定容量可能会造成内存浪费或空间不足的情况。
-
插入和删除元素时可能会产生大量的数据搬移,时间复杂度为O(N)。
-
示例(C语言):
#include <stdio.h>#define MAX_SIZE 10int static_array[MAX_SIZE] = {1, 2, 3, 4, 5};void print_static_array() {for (int i = 0; i < 5; i++) {printf("%d ", static_array[i]);}printf("\n"); }int main() {print_static_array(); // 输出:1 2 3 4 5return 0; }
-
-
动态顺序表(Dynamic Sequence Table):
-
定义:动态顺序表是一个支持动态扩容的数组。当数组的存储空间不足时,系统会自动分配更大的内存空间,并将原有元素复制到新数组中。
-
特点:
-
容量是动态可调的,通常根据需要扩展数组的容量(例如扩容为原来的2倍)。
-
数据的内存地址可能会发生变化,因为重新分配了更大的内存空间。
-
适合数据量不确定或需要经常变化的场景。
-
-
优点:
-
容量可动态增长,不会浪费内存空间。
-
避免了固定容量数组的空间不足问题。
-
-
缺点:
-
扩容操作可能会引起性能下降,尤其是在频繁扩容时,需要进行内存的重新分配和数据的搬移。
-
示例(C语言实现动态顺序表):
#include <stdio.h> #include <stdlib.h>typedef struct {int* array; // 动态分配的数组int size; // 当前元素个数int capacity; // 数组容量 } DynamicArray;// 初始化动态数组 void init(DynamicArray* arr) {arr->capacity = 2; // 初始容量为2arr->size = 0;arr->array = (int*)malloc(arr->capacity * sizeof(int)); }// 扩容:将数组容量翻倍 void resize(DynamicArray* arr, int new_capacity) {arr->array = (int*)realloc(arr->array, new_capacity * sizeof(int));arr->capacity = new_capacity; }// 向动态数组中添加元素 void append(DynamicArray* arr, int value) {if (arr->size == arr->capacity) {// 扩容resize(arr, 2 * arr->capacity);}arr->array[arr->size] = value;arr->size++; }// 打印数组内容 void print_array(DynamicArray* arr) {for (int i = 0; i < arr->size; i++) {printf("%d ", arr->array[i]);}printf("\n"); }// 释放动态数组内存 void free_array(DynamicArray* arr) {free(arr->array); }int main() {DynamicArray arr;init(&arr);// 添加元素append(&arr, 1);append(&arr, 2);append(&arr, 3); // 扩容时容量变为4append(&arr, 4);printf("动态顺序表的内容:\n");print_array(&arr); // 输出:1 2 3 4free_array(&arr); // 释放内存return 0; }
-
-
静态顺序表:内存空间是固定的,适用于数据量确定的情况,访问效率高,但插入和删除操作可能需要大量的数据搬移,且扩容困难。
-
动态顺序表:内存空间是可扩展的,适用于数据量不确定或变化较大的情况,动态扩容避免了固定容量带来的问题,但在扩容时可能会影响性能。
3. 顺序表 vs 链表
对比分析
特性 | 顺序表 | 链表 |
---|---|---|
存储方式 | 连续内存 | 离散内存,通过指针链接 |
随机访问 | O(1) | O(N) |
插入/删除 | O(N)(需移动元素) | O(1)(只需调整指针) |
空间管理 | 动态扩容可能浪费空间 | 按需分配,无空间浪费 |
缓存局部性 | 高(连续存储) | 低(节点分散) |
课堂练习
-
顺序表练习:实现一个函数,删除顺序表中所有等于给定值的元素。
-
链表练习:合并两个有序链表,返回新的有序链表头节点。
作业设计
-
编码题:
-
实现动态顺序表的缩容功能(当元素数量小于容量的1/4时,容量减半)。
-
实现双向链表的插入和删除操作。
-
-
分析题:
-
分析顺序表动态扩容均摊时间复杂度为何是O(1)。
-
对比单向链表和双向链表在删除尾节点时的时间复杂度差异。
-
教学总结
通过代码实现和对比分析,学生应掌握以下内容:
-
顺序表和链表的实现原理及适用场景。
-
动态扩容的策略与时间复杂度分析。
-
链表指针操作的逻辑与常见算法。
相关文章:
《线性表、顺序表与链表》教案(C语言版本)
🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C语言的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…...
【用Cursor 进行Coding 】
「我」:“添加 XXX 功能” [Claude-3.7]:“好的,我完成了,还顺手做了 19个你没要求不需要的功能、甚至还修改了原有999行正常代码 ~ 不用谢” [Gemini-2.5]:“好的,我会…...
vue2 打包时增加时间戳防止浏览器缓存,打包后文件进行 js、css 压缩
文章目录 前言一、什么是浏览器缓存二、展示效果三、vue.config.js 代码四、代码压缩部分服务器不支持五、感谢 前言 vue 开发过程中,项目前端代码需要更新,更新后由于浏览器缓存导致代码没有及时更新所产生错误,所以在打包时增加时间戳防止…...
TIM定时器
一、TIM定时器 STM32高级定时器实战:PWM、捕获与死区控制详解-CSDN博客 二、相关函数 1.TIM_TimeBaseInitTypeDef结构体讲解 typedef struct {uint16_t TIM_Prescaler; // 预分频器,用于设置定时器计数频率uint16_t TIM_CounterMode; /…...
S130N-ISI 全栈方案与云平台深度协同:重构 PLC 开发新范式
一、什么是 PLC? 1.技术定义 PLC(Power Line Communication)是一种创新的通信技术,它以电力线作为天然的传输介质,通过先进的信号调制技术将高频数据信号叠加于工频电流之上,实现电力输送与数据通信的双频共…...
Jenkins 插件文件优先使用 .jpi 后缀
.hpi 和 .jpi 文件本质上是 Jenkins 插件的打包格式,两者的区别主要体现在历史和命名习惯上: ✅ .hpi(Hudson Plugin) 来源:最初是 Hudson 项目的插件格式。含义:Hudson Plugin 的缩写。用途:早…...
# 决策树与PCA降维在电信客户流失预测中的应用
决策树与PCA降维在电信客户流失预测中的应用 在数据分析和机器学习领域,电信客户流失预测是一个经典的案例。本文将通过Python代码实现,探讨决策树模型在电信客户流失预测中的应用,并结合PCA降维技术优化模型性能,同时对比降维前…...
go语言的语法糖以及和Java的区别
1. Go 语言的语法糖及简化语法 Go 语言本身设计理念是简洁、清晰,虽然不像某些动态语言那样“花哨”,但它提供了几种便捷语法,使代码更简洁: 1.1 短变量声明(Short Variable Declaration) 语法࿱…...
WebRtc 视频流卡顿黑屏解决方案
// node webrtc视频转码服务 const url "http://10.169.xx.xx:8000" <video :ref"videoRefs${index}" :id"videoRefs4_${index}" :src"item" controls:key"item" autoplay muted click"preventDefaultClick"…...
信息安全测评中心-国产化!
项目上使用产品,必须通过国家信息安全测评/ 信息技术产品安全测评,有这个需求的话,可以到CN信息安全测评中心官网中的--测评公告一栏中,找符合要求的产品。 测评公告展示的包括硬件产品、系统、服务资质等。 网址及路径…...
MySQL学习笔记九
第十一章使用数据处理函数 11.1函数 SQL支持函数来处理数据但是函数的可移植性没有SQL强。 11.2使用函数 11.2.1文本处理函数 输入: SELECT vend_name,UPPER(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name; 输出: 说明&#…...
DFS 蓝桥杯
最大数字 问题描述 给定一个正整数 NN 。你可以对 NN 的任意一位数字执行任意次以下 2 种操 作: 将该位数字加 1 。如果该位数字已经是 9 , 加 1 之后变成 0 。 将该位数字减 1 。如果该位数字已经是 0 , 减 1 之后变成 9 。 你现在总共可以执行 1 号操作不超过 A…...
动态规划dp专题-(上)
目录 dp理论知识🔥🔥 🎯一、线性DP (1)🚀斐波那契数 -入门级 (2)🚀898. 数字三角形-acwing ---入门级 (3)往期题目 ①选数异或:在…...
正则表达式(一)
一、模式(Patterns)和修饰符(flags) 通过正则表达式,我们可以在文本中进行搜索和替换操作,也可以和字符串方法结合使用。 正则表达式 正则表达式(可叫作 “regexp”,或 “reg”&…...
需求变更导致成本超支,如何止损
需求变更导致成本超支时,可以通过加强需求管理、严格的变更控制流程、优化资源配置、实施敏捷开发、提高风险管理意识等方法有效止损。其中,加强需求管理是止损的核心措施之一。需求管理涉及需求明确化、需求跟踪和变更的管理,有效的需求管理…...
《数据分析与可视化》(清华)ch5-实训代码
小费数据集预处理——求思考题_有问必答-CSDN问答 以上代码在Jupyter Notebook中可以运行,但是在python中就会出如下问题: 这个错误表明在尝试计算均值填充缺失值时,数据中包含非数值类型的列(如文本列),…...
E: The package APP needs to be reinstalled, but I can‘t find an archive for it.
要解决错误 “E: The package mytest needs to be reinstalled, but I can’t find an archive for it”,通常是因为系统中存在损坏的软件包记录或安装过程中断导致 /var/lib/dpkg/status 文件异常。以下是综合多篇搜索结果的解决方案: 解决步骤 备份关…...
若依startPage()详解
背景 startPage基于PageHelper来进行强化,在用户传入pagesize,pageNum等标准参数的时候不需要进行解析 步骤 1.通过ServletUtils工具类getRequestAttributes来获取当前线程的上下文信息 public static ServletRequestAttributes getRequestAttributes() {try {R…...
Oracle AQ
Oracle AQ(Advanced Queuing) 是 Oracle 数据库内置的一种消息队列(Message Queue)技术,用于在应用或系统之间实现异步通信、可靠的消息传递和事件驱动架构。它是 Oracle 数据库的核心功能之一,无需依赖外部…...
npm报错CERT_HAS_EXPIRED解决方案
npm报错解决方案 npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED方案1:尝试切换镜像 # 使用腾讯云镜像 npm config set registry https://mirrors.cloud.tencent.com/npm/# 或使用官方npm源(科学上网) npm config set registry http…...
pnpm 中 Next.js 模块无法找到问题解决
问题概述 项目在使用 pnpm 管理依赖时,出现了 “Cannot find module ‘next/link’ or its corresponding type declarations” 的错误。这是因为 pnpm 的软链接机制在某些情况下可能导致模块路径解析问题。 问题诊断 通过命令 pnpm list next 确认项目已安装 Next.js 15.2.…...
急速实现Anaconda/Miniforge虚拟环境的克隆和迁移
目录 参考资料 点击Anaconda Prompt (anaconda_base) 查看现有环境 开始克隆,以克隆pandas_env为例,新的环境名字为image (base) C:\Users\hello>conda create -n image --clone pandas_env查看克隆结果,image环境赫然在列。 然后粘贴…...
OpenCv高阶(二)——图像的掩膜
目录 掩膜 bitwise_and原理 掩膜的实现 1、基于像素操作 2、使用形态学操作 3、基于阈值处理 案例 1、读取原图并绘制掩膜 2、掩膜的实现 3、绘制掩膜的直方图 应用 掩膜 OpenCV 中图像掩膜(Mask)实现的原理是通过一个与原始图像大小相同的二…...
数据结构和算法(十二)--最小生成树
一、最小生成树 定义:图的生成树是它的一颗含有其所有顶点的无环连通子图,一副加权无向图的最小生成树它的一颗权值(树中所有边的权重之和)最小的生成树。 约定:只考虑连通图。最小生成树的定义说明它只能存在于连通图…...
开源酷炫的Linux监控工具:sampler
sampler是一个开源的监控工具,来自GitHub用户sqshq(Alexander Lukyanchikov)的匠心之作。 简单来说,sampler能干这些事儿: 实时监控:CPU、内存、磁盘、网络,甚至应用程序的状态,它…...
InternVideo2.5:Empowering Video MLLMs with Long and Rich Context Modeling
一、TL;DR InternVideo2.5通过LRC建模来提升MLLM的性能。层次化token压缩和任务偏好优化(mask时空 head)整合到一个框架中,并通过自适应层次化token压缩来开发紧凑的时空表征MVBench/Perception Test/EgoSchema/MLVU数据benchmar…...
OSPF基础与特性
一.OSPF 的技术背景 OSPF出现是因为RIP协议无法满足大型网络的配置 RIP协议中存在的问题 RIP中存在最大跳数为15的限制,不能适应大规模组网 RIP周期性发送全部路由信息,占用大量的带宽资源 路由收敛速度慢 以跳数作为度量衡,选路可能会不优 存在路由环路的可能性 每隔30秒更新…...
[Linux]从零开始的ARM Linux交叉编译与.so文件链接教程
一、前言 最近在项目需要将C版本的opencv集成到原本的代码中从而进行一些简单的图像处理。但是在这其中遇到了一些问题,首先就是原本的opencv我们需要在x86的架构上进行编译然后将其集成到我们的项目中,这里我们到底应该将opencv编译为x86架构的还是编译…...
golang 中 make 和 new 的区别?
在Go语言中,make 和 new 都是用于内存分配的关键字,但它们在使用场景、返回值和初始化方式等方面存在一些区别,以下是具体分析: 使用场景 make 只能用于创建 map、slice 和 channel 这三种引用类型,用于初始化这些类型…...
碧螺春是绿茶还是红茶
碧螺春是绿茶,不是红茶。 碧螺春的特点: 类别: 碧螺春属于中国六大茶类中的绿茶类。产地: 它产自中国江苏省苏州市太湖的东山和西山(现称金庭镇),是中国十大名茶之一。外形: 碧螺春茶叶外形卷曲如螺,色泽…...
Linux平台搭建MQTT测试环境
Paho MQTT Paho MQTT 是 Eclipse 基金会下的一个开源项目,旨在为多种编程语言提供 MQTT 协议的客户端实现。MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅(Pub/Sub)消息传输协议ÿ…...
【AI学习】AI Agent(人工智能体)
1,AI agent 1)定义 是一种能够感知环境、基于所感知到的信息进行推理和决策,并通过执行相应动作来影响环境、进而实现特定目标的智能实体。 它整合了多种人工智能技术,具备自主学习、自主行动以及与外界交互的能力,旨…...
克魔助手(Kemob)安装与注册完整教程 - Windows/macOS双平台指南
iOS设备管理工具克魔助手便携版使用全指南 前言:为什么需要专业的iOS管理工具 在iOS开发和设备管理过程中,开发者经常需要突破系统限制,实现更深层次的控制和调试。本文将详细介绍一款实用的便携式工具的使用方法,帮助开发者快速…...
了解GPIO对应的主要功能
GPIO GPIO是通用输入输出端口的简称,芯片上的GPIO引脚与外部设备连接实现通讯、控制以及数据采集等功能,最基本的输出功能是通过控制引脚输出高低电平继而实现开关控制,比如引脚接入LED灯可控制LED灯的亮灭,接入继电器或三极管可…...
Dubbo 注册中心与服务发现
注册中心与服务发现 注册中心概述 注册中心是dubbo服务治理的核心组件,Dubbo依赖注册中心的协调实现服务发现,自动化的服务发现是微服务实现动态扩容、负载均衡、流量治理的基础。 Dubbo的服务发现机制经历了Dubbo2时代的接口级服务发现、Dubbo3时代的…...
一文详解LibTorch环境搭建:Ubuntu20.4配置LibTorch CUDA与cuDNN开发环境
随着深度学习技术的迅猛发展,越来越多的应用程序开始集成深度学习模型以提供智能化服务。为了满足这一需求,开发者们不仅依赖于Python等高级编程语言提供的便捷框架,也开始探索如何将这些模型与C应用程序相结合,以便在性能关键型应…...
micro ubuntu 安装教程
micro ubuntu 安装教程 官网地址 : https://micro-editor.github.io 以下是在 Ubuntu 系统中安装 micro 编辑器 的详细教程: 方法 1:通过 apt 直接安装(推荐) 适用于 Ubuntu 20.04 及以上版本(官方仓库已收录…...
观成科技:利用DoH加密信道的C2流量分析
概述 DoH(DNS over HTTPS)是一种通过HTTPS协议加密传输DNS查询的信道,将DNS请求封装在HTTP/2或HTTP/3中,DoH没有标准端口,部分服务沿用TLS的443端口。传统DNS明文传输易被拦截或篡改,而DoH通过加密提升了隐…...
行星际空间的磁流体动力激波:理论综述
Magnetohydrodynamic Shocks in the Interplanetary Space: a Theoretical Review ( Part 2 ) Magnetohydrodynamic Shocks in the Interplanetary Space: a Theoretical Review | Brazilian Journal of Physics Magnetohydrodynamic Shocks 1. The Rankine-Hu…...
Java垃圾回收的隐性杀手:过早晋升的识别与优化实战
目录 一、现象与症状 二、过早晋升的成因 (一)Young区(Eden区)配置过小 (二)分配速率过高 (三)晋升年龄阈值(MaxTenuringThreshold)配置不当 三、动态晋…...
2noise团队开源ChatTTS,支持多语言、流式合成、语音的情感、停顿和语调控制
简介 ChatTTS 是一个开源的文本转语音(Text-to-Speech, TTS)项目,由 2noise 团队开发,专门为对话场景设计。它在 GitHub 上广受欢迎,因其自然流畅的语音合成能力和多功能性而备受关注。 项目背景 目标:设计…...
企业级防火墙与NAT网关配置
实训背景 某公司需部署一台Linux网关服务器,要求实现以下功能: 基础防火墙:仅允许SSH(22)、HTTP(80)、HTTPS(443)入站,拒绝其他所有流量。共享上网…...
AI数据分析的正道是AI+BI,而不是ChatBI
一、AI大模型在数据分析中的应用现状与局限 当前用户直接上传PDF、Excel等原始数据至AI大模型进行自动分析的趋势显著,但其技术成熟度与落地效果仍需审慎评估。 1.主流AI大模型的数据分析能力对比 GPT-4/Claude 3系列:在通用数据分析任务中表现突出&a…...
C++设计模式优化实战:提升项目性能与效率
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle…...
G1学习打卡
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 import argparse import os import numpy as np import torchvision.transforms as transforms from torchvision.utils import save_image from torch.utils.…...
8.2 对话框2
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 8.2.3 FolderBrowserDialog(文件夹对话框) 组件 FolderBrowserDialog组件,用于选择文件夹 Folder…...
Java中的列表(List):操作与实现详解
引言 列表(List)是Java集合框架中最基础且使用最频繁的线性数据结构。它允许有序存储元素,支持重复值和快速访问。本文将深入探讨Java列表的核心操作方法,并剖析两种经典实现类(ArrayList和LinkedList)的底…...
在kotlin的安卓项目中使用dagger
在 Kotlin 的 Android 项目中使用 Dagger(特别是 Dagger Hilt,官方推荐的简化版)进行依赖注入(DI)可以大幅提升代码的可测试性和模块化程度。 1. 配置 Dagger Hilt 1.1 添加依赖 在 bu…...
MongoDB常见面试题总结(上)
MongoDB 基础 MongoDB 是什么? MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂…...
leetcode6.Z字形变换
题目说是z字形变化,但其实模拟更像n字形变化,找到字符下标规律就逐个拼接就能得到答案 class Solution {public String convert(String s, int numRows) {if(numRows1)return s;StringBuilder stringBuilder new StringBuilder();for (int i 0; i <…...