- 博客(94)
- 收藏
- 关注
原创 数字图像处理第二次实验
本文介绍了图像处理中的空间域和频域滤波技术实验。空间域实验实现了高斯噪声、椒盐噪声的生成,以及均值滤波、中值滤波、最大值和最小值滤波等多种空间域滤波方法,通过PSNR指标评估滤波效果。频域实验则实现了傅里叶变换与频谱分析、理想/巴特沃斯/高斯滤波器的设计、相位/幅度分离重构以及图像去噪处理等技术。实验结果表明,中值滤波对椒盐噪声效果最佳,而均值滤波更适合处理高斯噪声;在频域中,巴特沃斯滤波器在去噪与保留细节间取得较好平衡。文中还对比了不同滤波方法的优缺点,并提供了完整的Python实现代码。
2025-06-05 15:31:46
764
原创 数字图像处理第一次实验
本文介绍了两个基于OpenCV和Matplotlib的图像处理实验。实验一展示了灰度图像读取、直方图计算和可视化分析的技术流程,包含关键统计指标计算和图像特性分析。实验二重点演示直方图均衡化技术,通过对比处理前后图像及其直方图,量化分析对比度提升效果。两个实验均采用专业可视化呈现结果(2×2布局),支持中文字体显示,并输出详细的量化分析报告,包括均值、标准差、动态范围等关键指标对比。代码实现了完整的图像处理流程,从读取图像到结果保存,适用于教学和科研场景下的图像增强技术验证。
2025-06-05 15:03:49
991
原创 LeetCode百题刷004(哈希表优化两数和问题)
本文介绍了两种解决LeetCode"两数之和"问题的方法。第一种是暴力枚举法,通过双重循环查找符合条件的数对,时间复杂度O(n²),空间复杂度O(1)。第二种是优化的哈希表法,利用哈希表O(1)查询特性存储已遍历元素,只需单次循环即可找到匹配数对,时间复杂度降低为O(n),但增加了哈希表的空间开销。文章还解释了为什么哈希表要在遍历过程中动态更新,而不是预先建立,这种方式能更高效利用存储空间。两种方法各有优劣,哈希表法在时间效率上更优。
2025-05-26 21:10:53
520
原创 Linux复习笔记(六)shell编程
本文简要介绍了Shell编程的基础知识和常用操作。首先,Shell作为用户与Linux内核交互的桥梁,既是命令解释器,也是一种脚本语言。文章详细讲解了Shell脚本的编写规范、变量类型及其操作、算术与逻辑运算符的使用、流程控制语句(如if、case)、正则表达式的基本语法以及循环结构(如for、while)。此外,还涵盖了输入输出操作、文件判断和综合案例,如系统信息菜单和文件遍历统计。通过这些内容,读者可以快速掌握Shell编程的基本技能,并应用于实际脚本编写中。
2025-05-16 09:04:48
1135
7
原创 Linux复习笔记(五) 网络服务配置(dhcp)
DHCP(动态主机配置协议)是一种应用层协议,用于自动分配和管理IP地址,简化网络设备配置并提高IP地址利用率。其核心功能包括动态IP分配、地址管理和兼容性。DHCP通过DORA流程(发现、提供、请求、确认)完成地址分配,支持动态、自动和手动三种分配方式。租约机制控制IP地址的有效期,支持地址回收与复用。DHCP中继代理用于跨子网地址分配,将客户端的广播请求转换为单播,转发至远程DHCP服务器。配置文件(如/etc/dhcp/dhcpd.conf)包含参数、选项和声明,定义IP分配规则。常见参数包括租约时间
2025-05-14 17:04:59
1185
原创 Linux复习笔记(四) 网络服务配置(ftp)
FTP(文件传输协议)是一种用于在远程和本地计算机系统之间传输文件的标准协议,工作在应用层,使用TCP协议确保数据传输的可靠性,并支持断点续传功能。FTP的主要作用包括跨平台文件传输、高效资源共享、网站维护与内容更新以及网络管理优化。然而,FTP存在安全性缺陷,如未加密传输数据,易受中间人攻击,因此衍生出FTPS和SFTP等安全协议。 FTP基于客户-服务器模型,使用双连接机制:控制连接(默认TCP端口21)用于传输命令和响应码,数据连接负责实际文件传输。FTP有两种工作模式:主动模式(PORT)和被动模式
2025-05-14 00:15:48
905
原创 Linux复习笔记(三) 网络服务配置(web)
本文详细介绍了Web服务配置的基础知识,包括HTTP协议的核心作用、C/S架构、Web服务的工作流程以及URL格式解析。HTTP协议通过请求和响应报文实现客户端与服务器的通信,并通过Cookie和Session管理会话状态。Web服务分为静态和动态两种,动态服务支持用户交互和数据库查询。文章还介绍了主流动态语言(如ASP、PHP、JSP)的特点及部署环境,并详细解析了Apache服务器的配置和使用,包括如何更换监听端口、设置网页存储目录和发布静态网站。通过本文,读者可以掌握Web服务的基本原理和配置方法。
2025-05-12 18:15:11
1599
1
原创 LeetCode百题刷003(449周赛一二题)
本文介绍了一个解决字符串删除问题的算法,目标是通过删除最少的字符,使得字符串中最多保留k种不同的字符。首先,使用哈希表统计每个字符的出现次数,并按次数升序排序。如果字符种类数超过k,则逐步删除出现次数最少的字符,直到种类数等于k。最后,返回删除的字符总数。该算法通过统计频率、排序和累加操作,有效解决了问题,并提供了Python和C++的实现示例。
2025-05-11 16:51:47
1189
原创 LeetCode百题刷002摩尔投票法
本文介绍了三种解决LeetCode题目“169.多数元素”的方法。首先,排序法通过排序数组并取中间值来找到多数元素,时间复杂度取决于排序算法,空间复杂度为O(1)。其次,哈希表法利用哈希表记录元素出现次数,时间复杂度为O(n),空间复杂度为O(n)。最后,摩尔投票法通过抵消策略在O(n)时间复杂度和O(1)空间复杂度内找到多数元素,特别适合处理大规模数据。每种方法都有其优缺点,选择合适的方法可以提高问题解决的效率。
2025-05-09 17:01:34
1027
原创 LeetCode百题刷001双指针·快慢指针
本文介绍了如何解决LeetCode题目“80.删除有序数组中的重复项II”,要求原地修改数组并确保空间复杂度为O(1)。核心算法采用双指针技术,通过快指针i扫描数组,慢指针k标记有效部分的末尾。由于数组已排序,重复元素连续出现,只需确保每个元素最多保留两次。具体步骤包括:处理边界情况(数组长度≤2时直接返回),初始化慢指针k=2,遍历数组并检查当前元素是否与nums[k-2]相同,决定是否保留。最终,k即为新数组的长度。时间复杂度为O(n),空间复杂度为O(1)。
2025-05-09 12:49:14
427
原创 Linux复习笔记(二) 网络服务配置(samba /DNS)
协议基础核心进程:工作流程:要求:对于给的配置文件要会看,并且会按要求给出配置代码配置文件()全局配置(Global Settings):共享定义(Share Definition):2.1.2 全局配置参数及作用表(重点看蓝色) 参数 说明 Workgroup=MYGROUP 设置工作组名称,要求 Windows 主机的工作组必须与之同名 。这确保了 Samba 服务器与 Windows
2025-05-08 18:00:34
1438
原创 Linux复习笔记(一)基础命令和操作
要求:了解,知道有三个用户类型,知道之间的区别在Linux中,主要分为以下三种用户类型:(1)root用户:在Linux系统中,root用户的uid为0,该用户对所有的命令和文件具有访问、修改、执行的权限。(2)普通用户:系统中大多数的用户为普通用户,需要管理员用户进行创建,拥有的权限收到一定的限制,一般只在用户自己的主目录拥有完全权限,提升权限时,需要使用sudo命令。
2025-05-07 19:42:38
1416
2
原创 Linux:ftp 配置实验
实验目的:1. 了解 FTP 服务器工作原理2. 能够安装 FTP 服务器的软件3. 能够配置常用 FTP 服务。
2025-04-28 12:46:19
1197
原创 Linux:Web服务配置(课堂实验总结)
开放了端口,若未在 SELinux 策略中添加对该端口的支持,仍会阻止 Apache 绑定。SELinux 会严格控制进程对网络端口等资源的访问,即使通过。若提示 “Syntax OK”,说明语法无误;若有错误,根据提示修正。如果服务能正常启动,说明是 SELinux 策略导致的问题。确保 Apache 配置文件
2025-04-14 12:09:16
905
原创 Linux:DNS服务配置(课堂实验总结)
:BIND提供域名解析的基础服务,支持正向/反向解析、主从同步等功能。里边的ip 设成上图红圈内的就行。修改后就可以了,以下是成功结果。这两部分配置改成红圈内的IP。:(ip同样改自己的):(ip同样改自己的):(ip同样改自己的)红色部分填入自己的ip。(假设 IP 段为。
2025-04-13 15:26:55
1693
原创 数据结构与算法分析:哈希表简述(一)
哈希表(hash table),又称散列表,是一种高效的数据结构,用于存储键值对(Key-Value Pairs)。TableSize0比如:输入1得到A的时间复杂度为(相当于数组下标访问)
2025-04-09 20:04:51
1069
原创 软件工程(应试版)图形工具总结(二)
核心定义目的:描述软件系统的层次结构,体现模块的从属关系。适用阶段:自顶向下设计(Top-Down Design)的核心工具。形态特征树状结构,根节点为系统顶层模块。每个父模块分解为多个子模块。不展示模块间数据流或控制流。步骤1:确定系统边界。步骤2:构建模块层次树。步骤3:定义调用关系。步骤4:标注数据流。步骤5:处理特殊逻辑。步骤6:连接数据存储。步骤7:验证与优化。
2025-04-04 20:45:36
2024
原创 软件工程(应试版)图形工具总结(一)
1、顺序 以确定次序连接两个或多个分量;2、选择 从两个或多个可能的元素中选取一个;3、重复 即把指定的分量重复零次或多次。符号名称含义示例等价于(定义为)表示左侧与右侧等价,或左侧被定义为右侧内容。姓名 = 字符串→ 姓名字段定义为字符串类型。和(连接)连接两个分量,表示二者共同组成一个整体。姓名 + 地址→ 姓名和地址组合成一个结构。[ ]或(选择)从方括号内的多个分量中选择一个,通常用 `` 分隔选项。{ }重复重复花括号内的分量,可用上下限标注重复次数(如{数据}₁…₅。
2025-04-02 01:00:00
1717
1
原创 数据结构与算法分析:树(二)
定义左子树所有节点值 < 根节点值 < 右子树所有节点值的有序二叉树。数学表示∀节点X,设左子树为L,右子树为R,则满足 max(L) ≤ X ≤ min(R),即支持高效查找、插入、删除(时间复杂度 O(log n))。时间复杂度平衡时:树高≈log₂n → O(log n)最坏情况:树高=n → O(n)(如插入有序数据1→2→3→4)应用场景字典查询:通过字母顺序快速定位单词数据库索引:B+树基于BST思想加速数据检索示意图8/ \3 10/ \ \1 6 141.2. 节点结构。
2025-03-31 03:00:00
1060
原创 数据结构与算法分析:树(一)
背景:链表处理大量数据时,线性访问耗时多。二叉查找树多数操作平均运行时间为 O (log N),相对于链表树更加高效。递归定义是一种通过自我引用来描述数据结构或算法的方式。对于树这种分层结构,递归定义尤其自然,因为每个子树本身也是一棵树。基线条件(Base Case):定义最简单、不可再分的情况(通常是空树或叶子节点)。递归条件(Recursive Case):通过组合更小的树来定义更大的树。通用树的递归定义空树(基线条件),或者一个根节点,连接若干个子树。
2025-03-31 00:00:00
1331
原创 数据结构与算法分析:表、栈和队列(一)
ADT的核心在于理解接口与实现的分离,以及在不同场景下权衡时间、空间与工程复杂度1.1. ADT的本质:逻辑抽象与接口契约定义:ADT是数据对象及其操作的数学描述,仅定义 “行为”(操作语义),不涉及具体存储结构。关键特征封装性:隐藏内部实现,仅暴露操作接口。独立性:同一ADT可用不同数据结构实现(如栈可用数组或链表)。契约性:操作需满足前置/后置条件(如栈的pop要求非空)。int data;} Node;
2025-03-30 04:00:00
1206
原创 C++:allocator类(动态数组续)
这个只是简单模仿vector容器的核心机制,实际标准库实现会更复杂(包含异常安全、优化策略等很多东西):无法适配不同的内存管理策略(如内存池、共享内存等)。:解耦内存分配与对象构造,提供更灵活的内存管理。:内存池、性能优化、特殊内存区域(如共享内存)。等)默认使用的内存分配器。:将内存分配和对象构造合并为一个操作。6. 包含简单的扩容策略(容量翻倍):先分配原始内存块,但不构造对象。:在已分配的内存上手动构造对象。:针对特定场景优化内存分配速度。:手动析构对象,但不释放内存。:预分配大块内存,减少碎片。
2025-03-30 00:00:00
578
原创 数据结构与算法:算法分析
本章系统阐述了算法时间复杂度的分析方法与原则:渐近符号:大O(上界)、Ω(下界)、Θ(紧确界)、小o(严格上界)通过比较函数增长率,忽略常数和低阶项,揭示算法性能的渐近本质。例如,快速排序最坏为O(N²),但实际平均接近Θ(N log N)。运行时间法则:循环:次数乘积(嵌套循环)或求和(顺序语句),保留最高阶项。分支:取最坏分支时间。局限性:最坏情形分析可能高估实际需求(如希尔排序复杂度未完全解决),需结合实际问题收紧分析或依赖实验。设计启示:优先选择低增长率算法
2025-03-30 00:00:00
948
原创 C++ :动态内存与智能指针
1. 动态内存动态内存允许程序在运行时(而非编译时)按需分配堆内存,用于管理不确定生命周期或大小的对象,或需要跨作用域共享的数据。核心操作newnew[]:分配内存并构造对象。deletedelete[]:销毁对象并释放内存。使用场景动态数据结构(如链表、树、图)。大对象(避免栈溢出)。工厂模式返回不确定类型的对象。对象需在多个作用域间共享。手动管理痛点内存泄漏:忘记调用delete释放内存。悬空指针:提前释放内存后,其他指针仍访问该内存。异常不安全:代码异常可能导致delete。
2025-03-29 00:30:00
564
原创 C++:动态数组
C++的静态数组(如 )在编译时确定大小,无法在运行时动态调整:示例:若需要存储用户输入的未知数量元素,静态数组无法灵活处理。动态数组(如 )解决静态数组的痛点:以 为例,核心机制如下:3.2 扩容机制当 时,添加新元素会触发扩容:均摊时间复杂度:虽然单次扩容是 O(n),但均摊到每次操作后仍是 O(1)(类似“摊还分析”)。 T:数组元素的类型(如 、)。 get_size():数组长度,与固定大小的数组(如 )不同, 允许在运行时动态决定数组长度。这在以下场景中非常有用:①
2025-03-29 00:30:00
715
原创 C++:有序关联容器的插入与删除
通过键值删除返回删除的元素数量(对于set/map为0或1)两个子节点:找到后继节点,交换内容后删除后继节点。插入操作:强异常安全保证(失败时容器状态不变)平均和最坏时间复杂度均为O(log n)平均和最坏时间复杂度均为O(log n)找到合适位置后创建新节点(通常为红色)返回被删除元素的下一个元素的迭代器。删除操作:不抛出异常(无失败情况)是一个布尔值,若插入成功则为。调整红黑树性质(旋转和重新着色)调整红黑树性质(旋转和重新着色)是指向插入元素的迭代器,一个子节点:用子节点替代。
2025-03-28 00:00:00
787
原创 C++:无序关联容器
C++ 无序关联容器(unordered_set、unordered_map等)基于哈希表实现。其元素无序,平均操作时间复杂度为 O(1),最坏为 O(n)。底层是动态桶数组,用链地址法解决冲突,负载因子超 1.0 时扩容。C++无序关联容器(如unordered_set、unordered_map)基于哈希表,元素无序。平均操作时间复杂度O(1),最坏O(n) 。底层为动态桶数组,借链地址法解决冲突,负载因子超1.0时扩容。操作接口与有序容器相似,有桶管理接口。自定义类型作键需自定义哈希和相等比较。
2025-03-28 00:00:00
1531
原创 C++:有序关联容器的遍历和查找
C++ 有序关联容器(如 set、map 等)迭代器是双向迭代器,默认按关键字升序遍历,可自定义规则,键为 const 不可改,值可改。通过 begin ()/end ()、rbegin ()/rend () 获取正反向迭代器,用 find () 等查找元素,处理重复键用 equal_range ()。插入时迭代器通常不失效,删除时仅被删元素的迭代器失效。反向迭代器遍历方向相反,其 base () 方法可获取对应正向迭代器,可用于统计单词频率等应用。
2025-03-27 01:15:00
917
原创 C++ :关联容器
关联容器通过 高效存储和访问元素,与顺序容器(如vector)不同,它们的元素位置取决于键值,而非插入顺序。主要分为两类:(底层:红黑树)setmapmultisetmultimap(C++11引入,底层:哈希表)
2025-03-27 00:30:00
1120
原创 C++:iostream迭代器
读取失败(如类型不匹配)或遇到EOF时,迭代器变为尾后状态。:将输入/输出流抽象为元素序列,适配标准库算法。:输入迭代器不支持重复遍历,读取后元素不可回溯。:每个元素后均附加分隔符,包括最后一个元素。:生成尾后迭代器,用于标识流结束。:读取下一个元素,自动跳过空白符。:无实际作用,仅为保持接口一致性。:确保输出流有效,避免写入失败。:利用迭代器范围初始化容器。:每次写入后自动附加(如。:从输入流读取类型为。:向输出流写入类型为。:结合算法直接写入流。:显式处理每个元素。、文件流等输出目标。
2025-03-26 02:30:00
293
原创 C++:泛型算法
泛型算法(Generic Algorithm)是 C++ Standard Template Library (STL) 的核心组成部分,其本质是与容器类型无关的通用操作逻辑。通过模板和迭代器机制,泛型算法能够对任意满足迭代器接口的容器(如vectorlistmap)进行操作,实现代码复用和高度灵活性。核心特征容器无关性:不依赖具体容器类型,只要求容器提供迭代器。类型安全:通过模板参数推导类型,编译期检查错误。高性能:针对不同容器底层数据结构优化(如vector的连续内存访问、list。
2025-03-25 09:09:55
1274
原创 C++ :顺序容器
迭代器是STL容器元素的访问工具,类似于指针,但提供统一的抽象接口。遍历容器元素(如++操作)访问元素内容(如解引用)判断元素位置关系(如==比较)所有标准容器都提供迭代器,但不同容器的迭代器能力不同(如随机访问vs单向访问)1. 默认构造函数// 空vector// 空list// 空map特点:创建空容器适用场景:后续动态添加元素2. 列表初始化(C++11起)// 直接初始化元素// 包含3个int// 包含2个string注意使用大括号{}初始化可能触发构造函数。
2025-03-25 00:00:00
1209
1
原创 C++:IO库
>protected:// 自定义输出处理return c;// 使用自定义缓冲区标准库通过删除拷贝控制成员// ...// 拷贝构造删除// 赋值操作删除// 同样禁用拷贝构造和赋值#include <string> // 用于字符串操作#include <limits> // 用于numeric_limits2. 文件流类ofstream:输出文件流,用于写入文件。ifstream:输入文件流,用于读取文件。fstream:多功能文件流,支持读写操作。
2025-03-24 00:00:00
1268
原创 C++:类(通识版)
在C++中定义抽象数据类型(Abstract Data Type, ADT)的核心是通过类(class)将数据和对数据的操作封装起来,并对外仅暴露接口(API),隐藏实现细节。确定ADT的功能需求以栈(Stack)压栈(push):将元素添加到栈顶。弹栈(pop):移除栈顶元素。获取栈顶元素(top判断栈是否为空(isEmpty获取栈大小(size设计清晰的公共接口:覆盖所有用户操作需求。隐藏实现细节:数据成员和辅助函数设为private。管理资源。
2025-03-23 03:30:00
966
原创 C++:函数(通识版)
局部对象是指在函数内部或代码块(如{}包围的语句块)内定义的对象。特点作用域(Scope):仅在定义它的函数或代码块内可见。生命周期(Lifetime):从定义处开始,到离开作用域时自动销毁。函数声明(也称函数原型,Function Prototype)的主要目的是向编译器告知函数的存在,允许在函数定义之前调用它。核心作用类型检查:确保调用时参数类型和返回值类型正确。分离编译:支持多文件编程,声明通常放在头文件(.h)中。解决依赖。
2025-03-23 00:45:00
1135
原创 C++: string
是 C++ 标准库提供的用于处理字符串的类,封装了字符串的存储和操作,支持动态内存管理、丰富的成员函数和运算符重载。自动管理内存,无需手动释放。
2025-03-19 02:15:00
1681
原创 C++: 复合类型
定义:通过基本类型组合构建的新类型内存视角:管理多个数据单元的集合(连续或链式存储)核心作用组织复杂数据结构实现内存动态管理支持抽象数据类型(ADT)目的:组合不同类型的数据成员。// 20字节int age;// 4字节// 4字节内存对齐:编译器可能插入填充字节优化访问速度。Student大小可能是字节(无填充),但实际可能因对齐规则更大。char c;// 1字节int i;// 4字节(对齐到4的倍数地址)double d;
2025-03-19 00:30:00
941
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人