最短路问题
最短路问题的类型与解决算法
最短路问题分为单源最短路(1-n的最短路)和多元汇最短路(源点=起点,汇点=终点)
单元最短路
所有边权都是正数
朴素Dijkstra算法(O(n2)O(n^2)O(n2)),适合稠密图
堆优化的Dijkstra算法(O(mlogn)O(m\log n)O(mlogn))
存在负边权
Bellman-Ford (O(nm)O(nm)O(nm))
SPFA 一般:(O(m)O(m)O(m)),最坏(O(nm)O(nm)O(nm))
多元汇最短路 Floyd算法 O(n3)O(n^3)O(n3)
单元最短路
朴素Dijkstra算法
先加入起点
起点到其他点的距离都为无穷大,到自己是0
更新起点到其他点的距离,更新时判断是否最短
从未选择的点中选择距离最小的点,加入点集,重复上述操作,直至所有点都进入点集
算法实现
12345678910111213141516171819202122232425262728293031323334353637383940#include <bits/stdc++.h>using na ...
实时语义分割
论文名称:Rethinking BiSeNet For Real-time Semantic Segmentation
作者:Mingyuan Fan, Shenqi Lai, Junshi Huang, Xiaoming Wei, Zhenhua Chai, Junfeng Luo, Xiaolin Wei
code:https://github.com/MichaelFan01/STDC-Seg(尚未开源)
摘要
BiSeNet是目前流行的实时分割两流网络,但是添加额外的路径去进行编码非常耗时,并且由于任务专用设计的不足,主干可能无法有效地进行图像分割。
本文提出了STDC网络,通过消除结构冗余来实短期密集级联网络。
逐渐减小特征图维度,并将他们聚集用于图像表示,这构成了STDC网络的基本模块。在解码器中,我们通过将空间信息的学习以单流的方式集成到底层中,从而提出了一个细节集合模块。最后将底层特征和深层特征融合在一起,以预测最终的分割结果。
Short-Term Dense Concatenate Module(STDC,短期密集级联模块)
ConvX
STDC模块 ...
跨数据集语义分割
跨数据域协同学习的语义分割
论文名称:Cross-Dataset Collaborative Learning for Semantic Segmentation
作者:Li Wang, Dong Li, Yousong Zhu, Lu Tian, Yi Shan
期刊:CVPR2021
主要结构
DAB:Dataset-Aware Block(数据集感知块)
作为网络的基本计算单元,有助于捕获o不同功能数据集之间的同质表示和异构统计。
主要由,一个数据集不变的卷积层,多个数据集特定的BatchNormal和一个激活层构成。
DAT:Dataset Alternation Training(数据集交替训练机制)
分割结果:
跨数据域的训练
最初的跨数据集训练机制是运用在基于帧的动作识别上的。
后来通过简单的标签级联和标签映射产塞回给你的混合数据集应用到了目标检测上
Domain adaptation(DA 领域适应)或knowledge transfer(知识转化)为跨数据训练提供了有效的技术,目的是通过使用来自源域的知识和足够的标记数据来提高带有注释数据不足或缺少的目标 ...
渐进式语义分割
渐进式语义分割
论文名称:Progressive Semantic Segmentation
作者:Chuong Huynh, Anh Tran, Khoa Luu, Minh Hoai
期刊:CVPR2021
code:https://github.com/VinAIResearch/MagNet(作者好像改成私有仓库了)
问题描述
当对大型图片进行语义分割时,可能会导致显存炸掉。收到内存限制,可以选择下采样,或将图像划分为局部块。但前者会丢失细节,后者会却反全局视图。
后处理改善分割细节
经典方法
条件随机场(CRF),引导滤波器(GF),两个速度慢,改进是渐进的。
深度学习的引导过滤器(DGF)可以提高推理速度
迭代实例分割(ISS)
通过多次将输入图像和分割图像通过细化模块来多次细化输出。
这种细化过程是自反的,因此每一个细化层的输入图像都是相同的
CascadedPSP
才用与ISS相同的细化模式,但是对于每一个细化层的输入与ISS不同,才用的是不同分辨率的原图和分割图像进行细化。
MagNet
核心模块为:segmentation and refinement
在ref ...
数学建模算法合集
差分方程通解的求法
对任意一个差分方程式子全部移到左边,令右边为0
比如:an=an−1+an−2a_n = a_{n-1}+a_{n-2}an=an−1+an−2转化为an−an−1−an−2=0a_n-a_{n-1}-a_{n-2} = 0an−an−1−an−2=0
对ana_nan的系数,也作为其特征方程系数,产看上一步转化的式子中a的下标n−kn-kn−k中的k最大是多少,然后根据,k向下递减,确认k是否出现在第一步的式子中可得特征方程
a1xk+a2xk−1+...+bk=0a_1x^k+a_2x^{k-1}+...+b_k = 0
a1xk+a2xk−1+...+bk=0
求解这个方程得到特征根k1,k2,...,knk_1,k_2,...,k_nk1,k2,...,kn
则这个差分方程的通解为:
c1(k1)n+c1(k1)n+....+c1(k1)n=0c_1(k_1)^n+c_1(k_1)^n+....+c_1(k_1)^n = 0
c1(k1)n+c1(k1)n+....+c1(k1)n=0
求解特解只需要将其 ...
数据库理论(四)——数据库规范化与模式分解
数据库理论(四)——数据库规范化与模式分解
部分函数依赖
函数依赖的确定
1对1的关系时,有两个函数依赖
1对多时,有一个函数依赖
多对多时,没有函数依赖
函数依赖类型
右边不为左边的子集{非平凡函数依赖(A−>B),yes平凡函数依赖(AB−>B),no左边有子集能决定右边{部分函数依赖,yes完全函数依赖,no右边不为左边的子集
\begin{cases}
非平凡函数依赖(A->B),yes \\
平凡函数依赖(AB->B),no
\end{cases}\\
左边有子集能决定右边
\begin{cases}
部分函数依赖,yes\\
完全函数依赖,no
\end{cases}
右边不为左边的子集{非平凡函数依赖(A−>B),yes平凡函数依赖(AB−>B),no左边有子集能决定右边{部分函数依赖,yes完全函数依赖,no
传递函数依赖A->B,B->C,此时A—>C就是传递函数依赖
码和主属性
候选码:能够唯一决定一个元组的属性集叫做码
主属性:码里的属性就叫主属性
非主属性:不在码里的属性
超键:码或子集是码的属性集合 ...
数论的算法实现
数论
搬运自好友:therainisme的博客
试除法判定质数
就从2开始除,如果不能被整除就继续除,直到n\sqrt nn为止,也就是说,直到i∗i≤ni*i\leq ni∗i≤n为止
123456789bool check(int x){ if(x < 2) return false; else{ for(int i =2;i<= x/i;i++){ if(x%i==0) return false; } } return true;}
分解质因素
12345678910111213141516171819202122void divide(int x){ // 第一个数是质因数,第二个数是质因数的个数 for (int i = 2; i <= x / i; ++i) { // 从小到大的去取质数,稳 // i表示的是质数 if (x % i == 0) & ...
搜索算法
搜索
bfs和dfs
bfs搜到的点具有最短路性质,而dfs没有
最短用bfs,奇怪的用dfs
dfs
全排列问题:
dfs的流程:
代码实现:
12345678910111213141516171819202122232425262728293031323334353637// 关键时搜索顺序// dfs是递归// 回溯时要注意恢复现场#include <bits/stdc++.h>using namespace std;const int N = 10;int n; // 个数int path[N];// 路径存储bool st[N];// 是否被使用void dfs(int u){ // 最后一个就直接输出路径 if(u==n){ for(int i =0;i<n;i++){ printf("%d ",pat[i]+1); } // 每个方案后输出一个换行 cout<<endl; re ...
c++STL简单记录
C++的STL
源自好友:therainisme的博客
动态数组vector
12345678910111213141516171819202122232425262728// 声明模板,<>中可以定义动态u数组的类型// 支持索引取数vector<int> v;// 下面两个操作可以当成栈用v.push_back(x); // 在尾部插入一个元素v.pop_back(x); // 在尾部删除一个元素int n = v.size(); // 返回数组的个数v.clear(); // 清空数组v.empty();//是否为空v.back(); // 返回最后一个数据v.front(); // 返回第一个//排序简单的:sort(v.begin(),v.end());// 迭代器遍历,这里的auto对应的是vector<int>::iterator类型for(auto i = v.begin();i!=v.end();i++) cout<<*i;// find函数使用,algorithm包里的,应该不止vector能用str ...
zerorains的刷题记录
杂题记录
部分解题思路源自好友:therainisme
2021.4.25 dfs
判断是否为相同的树
解题思路:采用dfs,对这两棵树同时遍历,直到,这两棵树不同或完成为止
12345678910111213141516171819202122232425/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {& ...