排序算法
一、排序的基本概念1. 什么是排序?排序是将一个无序的序列按照某种既定规则(通常是元素的大小关系)重新排列成有序序列的过程。 例如:将数组 [3, 1, 4, 1, 5, 9] 按照升序排列为 [1, 1, 3, 4, 5, 9]。 2. 排序的核心要素 比较器:定义元素之间的“大小”关系。默认通常是 a < b(升序)或 a > b(降序)。 稳定性: 稳定排序:如果两个元素的值相等,它们在排序后的相对位置保持不变。 例如:[(2, "a"), (1, "b"), (2, "c")] 稳定排序后可能是 [(1, "b"), (2, "a"), (2, "c")]。 不稳定排序:相等元素的相对位置可能发生变化。 例如:上述例子不稳定排序后可能是 [(1, "b"), (2, "c"), (2, "a")]。 原地排序:排序过程中不使用额外的存储空间(或仅使用常数级的额外空间),直接修改原始序列。 时间复杂度:排序算法执行所需的时间与数据规模 n 的关系(通常关注最坏情况或平均情况)。 空间复杂度:排序算法执行所需的额外存储空间与数据规模 n...
哈希
哈希表是计算机科学中最重要、应用最广泛的数据结构之一。它通过“空间换时间”的策略,实现了在理想情况下 的查找、插入 and 删除效率。 一. 核心概念与定义哈希表(也叫散列表)是一种根据关键码值(Key)直接进行访问的数据结构。 基本原理:它通过一个函数——哈希函数(Hash Function),将主要数据(Key)映射到表中的一个位置(Index)来访问记录。 1.1 底层存储(Buckets/Slots)哈希表底层通常是一个数组。数组的每个位置被称为“桶(Bucket)”或“槽(Slot)”。 1.2 哈希函数(Hash Function)这是哈希表的灵魂。它的作用是将任意长度的输入(Key)转换为一个固定长度的整数索引。 Index = Hash(Key) \ \% \ ArraySize优秀的哈希函数应具备的特质: 确定性:对于相同的 Key,必须永远产生相同的 Hash 值。 高效性:计算速度要快(尽量使用位运算、移位等)。 均匀分布(最重要):输出值应尽可能均匀地分布在数组范围内,避免堆积。 1....
二叉树
一、基本概念二叉树是一种特殊的树结构,其中每个节点最多只有两个子节点,分别称为左子节点 和 右子节点。 术语 描述 根节点 (Root) 树的起始节点,没有父节点。 叶子节点 (Leaf) 没有子节点的节点。 度 (Degree) 节点拥有的子树数量(在二叉树中度最大为 2)。 深度/高度 (Depth/Height) 从根节点到最远叶子节点的最长路径上的节点数(或边数)。 二、特殊类型的二叉树1. 满二叉树 定义: 一棵深度为 且拥有 个节点的二叉树。 特性: 树中所有非叶子节点的度都为 2,且所有叶子节点都在同一层(最底层)。 判断标准: 节点总数 满足 。 2. 完全二叉树 定义: 深度为 ,有 个节点的二叉树。它的节点排列与满二叉树的前 个节点排列完全一致。 特性: 只有最底层(第 层)可能不满。 第 层的节点必须从左向右连续排列,中间不能有空缺。 用途: 堆 (Heap)...
堆
在数据结构与算法中,堆(Heap) 是一种基于完全二叉树的高效数据结构,其核心价值在于通过严格的结构约束和序性规则,实现对“极值元素”(最大值或最小值)的快速访问、插入和删除。以下从本质、实现细节、核心操作、应用场景等方面进行深度解析: 一、堆的本质:双重约束的完全二叉树堆的定义包含两个不可分割的条件,缺一不可: 1. 结构性约束:完全二叉树完全二叉树的特点是: 除最后一层外,所有层的节点均被完全填满(无空缺); 最后一层的节点从左到右连续排列,不允许中间有空缺(即若有节点缺失,只能在右侧)。 这种结构的优势是可以用数组紧凑存储(无需链表的指针开销),且节点间的父子关系可通过简单的数学公式直接计算(见下文“存储映射”)。 2. 序性约束:父节点与子节点的大小关系根据父节点与子节点的大小规则,堆分为两种: 大顶堆(Max Heap):任意节点的值 ≥ 其左右子节点的值(根节点是整个堆的最大值); 小顶堆(Min Heap):任意节点的值 ≤...
并查集
在数据结构中,并查集(Union-Find,又称 Disjoint Set Union) 是一种用于高效管理和处理元素分组(即“集合”)的结构,主要支持两种核心操作:合并两个集合和查询元素所属集合。它在解决“动态连通性”问题(如判断元素间是否存在连接关系、合并连接组件等)中表现优异,时间复杂度接近常数级。 一、并查集的核心需求并查集要解决的问题可以抽象为: 有 n 个元素,初始时每个元素自成一个独立集合({a}, {b}, {c}, ...)。 需要支持两种操作: Union(合并):将两个元素所在的集合合并为一个集合。 Find(查询):确定一个元素属于哪个集合(通常用“根节点”标识集合)。 最终目标:高效判断两个元素是否属于同一集合(通过比较根节点是否相同)。 二、并查集的基本实现思路并查集的底层通常用数组(或哈希表)存储元素与父节点的关系,数组索引代表元素,数组值代表该元素的“父节点”。 1. 初始状态每个元素的父节点是自身(parent[i] = i),表示每个元素单独构成一个集合,根节点就是自己。 2. Find...
C++ 开发核心概念与工具链
一.C++ 编译链接的整体流程1.C语言的编译系统预处理器 (cpp) 作用: cpp 是编译过程的第一个阶段。它根据源代码中以#开头的预处理指令(如#include、#define、#ifdef等)对源代码进行文本替换和宏展开。 输入: hello.c (源程序) 输出: hello.i 过程: 处理#include指令: 将包含的头文件(例如stdio.h)中的内容直接插入到hello.c文件的相应位置。 处理#define指令: 将宏定义替换为其实际的值。 处理条件编译指令: 如#ifdef、#ifndef、#if等,根据条件决定哪些代码段会被包含或排除。 删除注释: 通常也会在此阶段删除代码中的注释。 编译器 (ccl) 作用: ccl (C Compiler) 将预处理后的C语言源代码(hello.i)翻译成汇编语言程序(hello.s)。编译器会进行语法分析、语义分析、代码优化等,将高级语言代码转换为低级汇编语言代码。 输入: hello.i (修改的源程序) 输出: hello.s 过程: 词法分析、语法分析、语义分析:...
人工智能基础5-与学习相关的技巧
[!NOTE] 参考说明 本笔记参考《深度学习入门:基于Python的理论和实现》 下述内容可简单了解,具体使用时再说。 本章核心神经网络的学习不仅仅是梯度的计算。为了让模型训练得更好,我们需要关注: 1.参数更新方法(除了 SGD 还有更好的吗?)2.权重初始值(一开始的参数怎么设?)3.Batch Normalization(如何强制调整数据分布?)4.正则化(如何防止过拟合?)5.超参数最优化(学习率等参数怎么调?) 一. 参数的更新SGD 是最基础、最简单的优化算法。它的核心思想是:朝着梯度方向的反方向,一步一步地更新参数。 我们在前面一直使用的是 SGD (随机梯度下降)。虽然简单,但它在处理某些复杂地形(如延伸状的函数曲面)时效率很低。 1.1 SGD 的缺陷W \leftarrow W - \eta \frac{\partial L}{\partial W}1. 在“非均向”函数上效率极低 非均向:指的是函数形状在不同方向上延伸程度不同(例如:像一个沿着 x 轴拉长的“碗”或椭圆山谷)。 现象:在这种函数上,梯度的特征是: 在陡峭的方向(如 y...
人工智能基础4-误差反向传播法
[!NOTE] 参考说明 本笔记参考《深度学习入门:基于Python的理论和实现》 神经网络梯度计算:数值微分:实现简单,但计算量大,速度慢(上一章的方法)。误差反向传播法:实现稍复杂,但计算速度极快,是训练深度神经网络的必经之路。 一. 计算图为了直观地理解误差反向传播,书中引入了计算图的概念。 1.1 什么是计算图?将计算过程用“节点”和“箭头”表示的图形。 正向传播 (Forward):从左向右。计算结果(例如:买了多少钱)。 反向传播 (Backward):从右向左。计算导数(例如:苹果价格波动 1 元,总价波动多少)。 1.2 局部计算 定义:每个节点只关注自己相关的两个输入和输出,不用管全局。 【直观理解】: 比如你在收银台结账(最后的节点)。你只需要把“单价 数量”算好传给下一个环节(加税)。你不需要知道这个苹果是哪里摘的,也不需要知道税率是多少。 意义:这让我们可以把极其复杂的神经网络,拆解成无数个简单的“加法”和“乘法”积木。 1.3...
人工智能基础3-神经网络的学习
[!NOTE] 参考说明 本笔记参考《深度学习入门:基于Python的理论和实现》(第4章)。 核心定义:这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程。核心指标:引入损失函数 (Loss Function)。学习的目的是找到使损失函数值最小的权重参数。核心方法:利用梯度法 (Gradient Method),通过函数斜率来寻找最小值。 一. 从数据中学习神经网络最大的特征就是可以“从数据中学习”,即由数据自动决定权重参数的值,从而避免了人工介入参数设计的繁琐。 1.1 数据驱动的方法演变我们以识别手写数字“5”为例: 方法 描述 特点 以人为主 编写特定的逻辑规则(如:这里有个圆弧,那里有个横线) 极其困难,很难总结出普适规律。 机器学习 (Machine Learning) 人工设计特征量 (SIFT, HOG等) 转换为向量 SVM/KNN 学习 特征量仍需人工设计,机器只学习分类模式。 深度学习 (Deep Learning) 端到端 (End-to-End) 的学习。直接输入原始图像 ...
人工智能基础2-神经网络
[!NOTE] 参考说明 本笔记参考《深度学习入门:基于Python的理论和实现》 一.核心概念对比感知机 优点: 理论上,感知机有潜力表示复杂的函数(计算机的本质就是复杂的逻辑门组合)。 缺点: 无法自动学习。确定合适的权重和偏置仍需人工完成(例如手动设计 AND/OR 门的参数)。 神经网络 目的: 解决感知机需要人工设定参数的问题。 核心性质: 能够自动地从数据中学习到合适的权重参数。 二. 从感知机到神经网络2.1 神经网络的结构典型的神经网络结构如下图所示: 层级划分: 输入层(第 0 层):接收原始数据。 中间层(第 1 层):也称为隐藏层,因为其神经元在输入和输出之间,肉眼不可见。 输出层(第 2 层):输出最终结果。 [!TIP] 关于层数的命名 图中有 3 列神经元,但通常称为 “2层网络” 或 “3层网络”。 本书约定:根据实质上拥有权重的层数(即箭头连接的层数)来命名。输入层到隐藏层(1组权重),隐藏层到输出层(1组权重),故称为 2层网络。 也有文献算上输入层称为3层网络。为了避免歧义,通常直接指明“拥有1个隐藏层”。 2.2...