并查集
什么是并查集?实现一个共用的群组之集合的类,通过群主表示不同的群组,当且仅当群主是自己表示孤立节点或者群主节点,每个人都有一个主,修改了主只需要修改一个,在查的时候按照主的主来寻找最终的主,最开始每个人的主是自己。
核心操作
Find:查找元素所属集合的代表元(根节点)
Union:合并两个元素所在的集合
想象你有一堆人(节点),他们之间会互相认识(连接)。并查集就是用来:
快速判断两个人是否互相认识(直接或间接)
让两个不认识的人变成认识(把他们的朋友圈合并)
生活中的例子假设班上有5个同学:
小明、小红、小刚、小丽、小强
初始状态:每个人只认识自己
第一步:建立朋友圈
小明和小红成为朋友 → 他们现在是一个朋友圈
小刚和小丽成为朋友 → 另一个朋友圈
小强自己一个人 → 单独的朋友圈
现在朋友圈情况:
朋友圈1:小明、小红
朋友圈2:小刚、小丽
朋友圈3:小强
第二步:朋友的朋友小红认识了小刚 → 现在小红的朋友圈和小刚的朋友圈合并
现在朋友圈情况:
大朋友圈:小明、小红、小刚、小丽
单独朋友:小强
第三步:查询是否认识
小明认识小丽吗? → 是的(通过小红和小 ...
结构风险最小化 VS 经验风险最小化
结构风险最小化(Structural Risk Minimization, SRM)策略[[VC维理论]]
1. 基本概念结构风险最小化是统计学习理论中的核心策略,由Vapnik提出,旨在解决机器学习模型的过拟合问题。其核心思想是在经验风险(训练误差)和模型复杂度之间寻求平衡,以最小化模型的总体风险(即泛化误差)。
2. 关键组成部分
经验风险(Empirical Risk)
模型在训练数据上的平均损失(如分类错误率、均方误差)。
公式:$$ R_{\text{emp}}(f) = \frac{1}{n} \sum_{i=1}^n L(f(x_i), y_i) $$,其中 $$ L $$ 为损失函数。
结构风险(Structural Risk)
总体风险 = 经验风险 + 正则化项(模型复杂度惩罚)。
公式:$$ R_{\text{struct}}(f) = R_{\text{emp}}(f) + \lambda \cdot \Phi(f) $$,其中 $$ \Phi(f) $$ 表示模型复杂度(如参数数量、VC维),$$ \lam ...
条件随机场
数学表示线性链CRF的数学表达式基于势函数(potential functions)和特征函数(feature functions)。
一个(标签/输出)序列 $Y = (y_1, y_2, \dots, y_n)$ 在给定输入序列 $X = (x_1, x_2, \dots, x_n)$ 下的条件概率可以写成:
$$P(Y|X) = \frac{1}{Z(X)} \exp \left( \sum_{i,k} \lambda_k t_k(y_{i-1}, y_i, X, i) + \sum_{i,l} \mu_l s_l(y_i, X, i) \right)$$
其中:
$Z(X)$ 是归一化因子(或称配分函数),确保所有可能输出序列的概率之和为1。
$t_k(y_{i-1}, y_i, X, i)$ 是转移特征函数(transition feature function),它依赖于当前位置的标签 $y_i$、前一个位置的标签 $y_{i-1}$ 以及整个输入序列 $X$和离散时间i。它通常用于捕捉相邻标签之间的依赖关系。
$s_l(y_i, ...
最小栈、最大栈、双向支持的最小最大栈
✅ 什么是最小栈(Min Stack)?最小栈是一种支持常数时间内(O(1)) 获取栈中最小值的栈结构。
🔧 标准栈的限制通常,使用普通栈只能O(n) 时间遍历才能找出最小值:
12stack = [3, 4, 2, 5]min_val = min(stack) # O(n)
但最小栈支持:
push(x):压入元素
pop():移出栈顶
top():查看栈顶元素
getMin():O(1) 获取栈中最小值
🧠 核心思想借助一个辅助栈来同步维护当前栈的最小值。例如:
操作
原始栈(main_stack)
最小栈(min_stack)
push(5)
5
5
push(3)
5, 3
5, 3
push(4)
5, 3, 4
5, 3, 3
pop()
5, 3
5, 3
getMin()
return 3
top of min_stack
✅ Python 最小栈实现示例1234567891011121314151617181920212223class MinStack: def __init__(self): s ...
ML面试问题排查
说明L1 VS L2正则化 原理、区别和防止过拟合原理:公式、过拟合原理(圆形和菱形约束,L1容易落在坐标轴)、求导和计算复杂性、1.优化目标一般是损失函数加上正则化项,L1正则化表示正则化项为参数绝对值之和,乘以一个系数λ;L2表示… ,系数除以2是便于求导和消去次数
BN的核心思想和计算步骤、基本原理在神经网络每一层输入前,对当前小批量特征数据进行标准化处理,将特征均值为0方差为1(不是缩放到0-1区间),避免内部协变量偏移,提高训练稳定性
计算步骤:计算均值和标准差,然后对该批次的特征进行标准化,即减去均值再除以标准差,该过程考虑防止除0通常会在方差求标准差开根号前加一个极小数,然后使用可学习的参数进行线性变化原理:避免前一层数据输出过大或国小,防止前一层输出到下一层进行饱和区导致梯度消失
大模型常用RMSnorm和preNorm降低计算量,省略了减去均值的操作,直接除以特征均方根,乘以λ尽早稳定输入分布
RMS vs 标准差
内部协变量偏移神经网络训练中,前一层参数更新导致后一层输入数据的分布发生持续、剧烈变化的现象。这种分布变化会为后层训练带来干扰,最终降低模型训练效率、减缓 ...
ML算法机器学习
复习一下1.优先覆盖基础知识点,包括选择题、要点、算法基本步骤和原理等2.其次,手撕算法其它:[[CV]]
算法[[k近邻算法,KNN算法]][[朴素贝叶斯算法NB]] TO PERFICT[[决策树]] TO PERFICT[[条件随机场]][[boosting算法对比]][[HMM]][[MEMM]][[关联规则挖掘方法]][[logistic回归]]
采样[[采样方法]][[抽样方法]]
特征工程[[高基数离散特征对于树模型和神经网络模型的影响大小]][[ID 特征的处理]]
交叉检验[[交叉验证]]
习题[[ML习题和零散知识点]][[生成式模型VS判别式模型]][[kd树]][[ANN(近似最近邻搜索)]][[BP神经网络 VS 感知机]][[ML面试问题排查]][[结构风险最小化 VS 经验风险最小化]]
[[Apriori算法]]
正则化是模型选择的典型方法,也是结构风险最小化策略的实现
结构风险最小化旨在解决机器学习模型的过拟合问题。其核心思想是在经验风险(训练误差)和模型复杂度之间寻求平衡,以最小化模型的总体风险(即泛化误差)。
想法[[条件概率查找表]]
LRU
设计LRU缓存结构_牛客题霸_牛客网设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 capacity ,操作次数是 n ,并有如下功能:
Solution(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
get(key):如果关键字 key 存在于缓存中,则返回key对应的value值,否则返回 -1 。
set(key, value):将记录(key, value)插入该结构,如果关键字 key 已经存在,则变更其数据值 value,如果不存在,则向缓存中插入该组 key-value ,如果key-value的数量超过capacity,弹出最久未使用的key-value
提示:1.某个key的set或get操作一旦发生,则认为这个key的记录成了最常使用的,然后都会刷新缓存。2.当缓存的大小超过capacity时,移除最不经常使用的记录。3.返回的value都以字符串形式表达,如果是set,则会输出”null”来表示(不需要用户返回,系统会自动输出),方便观察4.函数set和get必须以O(1)的方式运行 ...
对象销毁
如何手动销毁 指针、变量和类数组?1. 引用(Reference):无法手动销毁⚠️ 引用本身无法手动销毁!因为:
引用只是别名
生命周期跟随被引用对象
不能重新绑定到其他对象
2. 指针(Pointer)->delete2.1 单个对象指针1234// 动态分配的单个对象MyClass* ptr = new MyClass();delete ptr; // ✅ 销毁对象ptr = nullptr; // ✅ 好习惯:置空指针
2.2 数组指针1234// 动态分配的数组MyClass* arrPtr = new MyClass[5];delete[] arrPtr; // ✅ 注意用delete[]arrPtr = nullptr;
2.3 智能指针(推荐),自动销毁123456789#include <memory>// unique_ptr自动管理生命周期std::unique_ptr<MyClass> smart_ptr(new MyClass());// 离开作用域自动销毁// shared_ptr引用计数st ...
老环境配置记录modelscope
其实tensorflow 不需要,在命名实体识别任务的demo
12345678export PATH="/mnt/workspace/miniconda3/bin:$PATH"conda init# 重启terminalconda activate py37testmaasconda create -n py37testmaas python=3.7pip install cryptography==3.4.8 tensorflow-gpu==1.15.5 torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0pip install "modelscope[nlp]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
1234567891011121314151617181920212223(py37testmaas) bash-5.2# pip install "modelscope[nl ...
类
类的构造函数/析构函数可不可以私有?是的,当你定义一个类数组,例如:
1class_A m[5];
✅ 会调用 class_A 的构造函数,并且会为每个元素调用一次!当数组 m[5] 的作用域结束或被销毁,也会自动调用析构函数!
🧠 分析细节假设你的类如下:12345678#include <iostream>class class_A {public: class_A() { std::cout << "Default constructor called\n"; }};
当你写:
1class_A m[2];
输出为:
12Default constructor calledDefault constructor called
🟢 默认构造函数 class_A() 被调用 2次**,每个数组元素都进行一次构造。
❗注意情况 1:构造函数被删除(未定义)、带参数数组 或私有,不能默认构造123456class class_B {public ...