前缀和和差分和dijkstra算法和二分算法和floyd算法

简介: 前缀和和差分和dijkstra算法和二分算法和floyd算法

前缀和

一维前缀和

arr为原数组 
s 为前缀和之后的数组
s[n]=s[n-1]+arr[n];

例题

二维前缀和

j1 j2 j3 j4 j5 j6
i1 7 8 3 4 3 4
i2 1 2 3 4 5 6
i3 7 8 3 4 3 4
i4 1 3 4 6 0 4

最上面和最左边是坐标

s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+arr[i][j];
最后求结果,一个子区间
x1,y1,x2,y2
s[x2][y2]-s[x1-1][y2]-a[x2][y1-1]+s[x1-1][y1-1]

差分

一维差分

int l,r,c;
cin>>l>>r>>c;
arr[l]+=c;
arr[r+1]-=c;
前缀和
brr[i]=brr[i-1]+arr[i];

例题

二维差分

int x1,y1,x2,y2,c;
    cin>>x1>>y1>>x2>>y2>>c;
    brr[x1][y1]+=c;
    brr[x2+1][y1]-=c;
    brr[x1][y2+1]-=c;
    brr[x2+1][y2+1]+=c;

dijkstra

朴素版的dijkstra

这主要是用邻接矩阵来存图主要用来处理数据比较少的情况(稠密图)

const int N=1e3+10;
int g[N][N];//用来存两点之间的距离
int dist[N]; //用来存起始点到任意一点的距离
bool st[N];//用来表示这个点是否已经访问过
int n;//代表所要求的点
memset(dist,0x3f,sizeof(dist));
dist[1]=0;//初始化一定不能少
for (int i = 0; i < n; i++) {
  int t = -1;
  for (int j = 1; j <= n; j++) {
    if (!st[j] && (dist[t] > dist[j] || t == -1)) {
      t = j;
    }
  }
  st[t] = true;
  for (int j = 1; j <= n; j++) {
    dist[j] = min(dist[j], dist[t]+g[t][j]);
  }
}

例题

二分

第一种

int l=0,r=n;
while(l<r){
    int mid=l+r>>1;//int mid=(l+r)/2
    if(k<=arr[mid]){
        r=mid;
    }else{
        l=mid+1;
    }
}

第二种

int l=0,r=n;
while(l<r){
    int mid=l+r+1>>1//int mid=(l+r+1)/2;
    if(k>=arr[mid]){
        l=mid;
    }else{
        r=mid-1;
    }
}

例题1

例题2

floyd

这是一个多源汇最短路。时间复杂度为n^3

首先第一步还是初始化,与其他初始化不同的是这个算法的初始化变为:1

接着就是存图,仍然用邻接矩阵来存图 2

最后就是算法模板

1:

for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j++){
        if(i==j){
            g[i][j]=0;
        }else{
            g[i][j]=INF;
        }
    }
}

2:

for(int k=1;i<=n;k++){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
        }
    }
}

这个算法是基于一个动态规划的思想

g[k,i,j] 表示从i到j中间经过k个点

g[k,i,j]=min(g[k-1,i,j],g[k-1,i,k]+g[k-1,k,j])//经过第k个点和不经过第k个点,取最小值

例题

MySQL中的索引的情况

索引(index)是什么,相当于一本书的目录,根据目录中每个章节对应的页码,就能快速地找到对应的章节,MySQL中的索引也是一样,当从数据库中进行查找的时候,例如按照一定的条件来查找

查找可以遍历表,但是遍历表操作比较低效,就需要想办法尽量的避免遍历,可以通过一些特殊的数据结构,来表示一些记录的特征,通过这些特征来减少比较的次数,加快比较的效率

索引的主要意义就是进行查找,要提高查找的效率

查找效率提高了,但同时也要付出一些代价:

书的目录是废纸的,数据库的索引也是需要额外的存储空间的,数据量越大,索引消耗的存储空间就越多,书的目录如果确定了,后续每次对书的内容进行调整,都可能影响到目录的准确性,就需要重新调整目录,数据库的索引也是一样,当进行增删改查的时候,往往需要同步的调整索引的结构

索引带来的好处:提高了查找的效率,索引带来的坏处:占用了更多的空间,拖慢了增删改的速度


相关文章
|
6月前
|
存储 运维 监控
基于 C# 语言的 Dijkstra 算法在局域网内监控软件件中的优化与实现研究
本文针对局域网监控系统中传统Dijkstra算法的性能瓶颈,提出了一种基于优先队列和邻接表优化的改进方案。通过重构数据结构与计算流程,将时间复杂度从O(V²)降至O((V+E)logV),显著提升大规模网络环境下的计算效率与资源利用率。实验表明,优化后算法在包含1000节点、5000链路的网络中,计算时间缩短37.2%,内存占用减少21.5%。该算法适用于网络拓扑发现、异常流量检测、故障定位及负载均衡优化等场景,为智能化局域网监控提供了有效支持。
164 5
|
3月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
265 14
|
3月前
|
机器学习/深度学习 边缘计算 分布式计算
基于差分进化算法的微电网调度研究(Matlab代码实现)
基于差分进化算法的微电网调度研究(Matlab代码实现)
155 1
|
3月前
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
359 4
|
4月前
|
算法 机器人 定位技术
基于机器视觉和Dijkstra算法的平面建筑群地图路线规划matlab仿真
本程序基于机器视觉与Dijkstra算法,实现平面建筑群地图的路径规划。通过MATLAB 2022A读取地图图像,识别障碍物并进行路径搜索,支持鼠标选择起点与终点,最终显示最优路径及长度,适用于智能导航与机器人路径规划场景。
|
6月前
|
机器学习/深度学习 算法
基于差分进化灰狼混合优化的SVM(DE-GWO-SVM)数据预测算法matlab仿真
本项目实现基于差分进化灰狼混合优化的SVM(DE-GWO-SVM)数据预测算法的MATLAB仿真,对比SVM和GWO-SVM性能。算法结合差分进化(DE)与灰狼优化(GWO),优化SVM参数以提升复杂高维数据预测能力。核心流程包括DE生成新种群、GWO更新位置,迭代直至满足终止条件,选出最优参数组合。适用于分类、回归等任务,显著提高模型效率与准确性,运行环境为MATLAB 2022A。
|
9月前
|
机器学习/深度学习 算法 机器人
强化学习:时间差分(TD)(SARSA算法和Q-Learning算法)(看不懂算我输专栏)——手把手教你入门强化学习(六)
本文介绍了时间差分法(TD)中的两种经典算法:SARSA和Q-Learning。二者均为无模型强化学习方法,通过与环境交互估算动作价值函数。SARSA是On-Policy算法,采用ε-greedy策略进行动作选择和评估;而Q-Learning为Off-Policy算法,评估时选取下一状态中估值最大的动作。相比动态规划和蒙特卡洛方法,TD算法结合了自举更新与样本更新的优势,实现边行动边学习。文章通过生动的例子解释了两者的差异,并提供了伪代码帮助理解。
703 2
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
263 0
|
2月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
200 2
|
3月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
226 3