当前位置: 首页 > news >正文

蓝桥杯软件赛Java研究生组/A组)第二章基础算法-第三节:倍增

文章目录

  • 一:概述
  • 二:典型题目
    • (1)题目一(快速幂)
    • (2)题目二(ST表求区间最值)
    • (3)题目三(最近公共祖先)

一:概述

倍增算法:是一种优化算法,通常应用在某些需要高效计算指数幂的场景。它基于分治的思想,通过反复求平方来实现快速计算指数幂的目的。通常应用在最近公共祖先问题、二分查找等等

二:典型题目

(1)题目一(快速幂)

倍增算法最经典的应用就是快速幂,快速幂算法是一种高效计算大整数幂的方法。如下快速幂计算 a b a^{b} ab

  • b b b为偶数时

a b = a b 2 ∗ a b 2 = ( a 2 ) b 2 a^{b} = a^{\frac{b}{2}}* a^{\frac{b}{2}}=(a^{2})^{\frac{b}{2}} ab=a2ba2b=(a2)2b

  • **当 b b b为奇数时

a b = a ∗ a b 2 ∗ a b 2 = a ∗ ( a 2 ) b 2 a^{b} = a*a^{\frac{b}{2}}* a^{\frac{b}{2}}=a*(a^{2})^{\frac{b}{2}} ab=aa2ba2b=a(a2)2b

** b 2 \frac{b}{2} 2b向下取整,迭代求解,直到 b b b为0为止

public static long qmi(long a, long b, long p) {long res = 1;  // 初始化结果为 1while (b > 0) {  // 当指数 b 大于 0 时执行循环if (b & 1 == 1) {  // 判断指数 b 的最低位是否为 1res = res * a % p;  // 如果最低位为 1,则将底数 a 的当前幂乘到结果中,并取模 p}a = a * a % p;  // 底数 a 自乘,相当于计算 a^2, a^4, a^8, ...b >>= 1;  // 将指数 b 右移一位,相当于将指数减半}return res;  // 返回结果
}

例如计算 2 13 2^{13} 213

  • r e s = 2 , a = 2 2 , b = 6 res=2,a=2^{2},b=6 res=2,a=22,b=6

  • r e s = 2 , a = 2 4 , b = 3 res=2,a=2^{4},b=3 res=2,a=24,b=3

  • r e s = 2 5 , a = 2 8 , b = 1 res=2^{5},a=2^{8},b=1 res=25,a=28,b=1

  • r e s = 2 13 , a = 2 16 , b = 0 res=2^{13},a=2^{16},b=0 res=213,a=216,b=0

  • 倍增一般会和其他算法结合使用

(2)题目二(ST表求区间最值)

在这里插入图片描述

思路:见ST表第二节:ST表

int[] arr; // 给定的array
int n = arr.length;// 预处理log数组,log[i]表示不大于i的最大二进制幂的指数
int[] log = new int[n+1];
log[1] = 0;
for(int i = 2; i <= n; i++) {
log[i] = log[i/2] + 1;
}// 初始化ST表,st[i][j]表示从位置i开始,长度为2^J的区间的最值
int[][] st = new int[n][log[n]+1];
for(int i = 0; i < n; i++) {
st[i][0] = arr[i]; // 长度为1的区间的最值就是其本身
}// 动态规划填表
for(int j = 1; j <= log[n]; j++) {
for(int i = 0; i + (1<<j) <=n; i++) {
st[i][j] = Math.max(st[i][j-1], st[i+(1<<(j-1))][j-1]);
}
}// 查找区间[L,R]的最值
int k = log[R-L+1];
// 这两个区间为:[L, L+2^k-1]和[R-2^K+1,R]return Math.max(st[L, k], st[R-(1<<j)+1][k])

(3)题目三(最近公共祖先)

在这里插入图片描述

在这里插入图片描述

void dfs(int x, int u) {dep[x] = dep[u] + 1;// 设置当前节点的深度father[x][0] = u; // 直接父节点// 倍增法处理向上父节点for(int i = 1; i <= 20; i++) {father[x][i] = father[father[x][i-1]][i-1];}// 递归for(int y: list[x]) {if (y != u)dfs(y, x)}
}int lca(int x, int y) {// 确保x是更深的节点if (dep[x] < dep[y]) {swap(x, y);}// x向上跳,使x和y在同一深度for(int i = 20; i >= 0; i--) {if(dep[father[x][i]]>=dep[y]) {x = father[x][i];}}// 如果x和y相等,则找到了lcaif (x == y)return x;// 否则,同时开始向上跳,寻找for(int i = 20; i >= 0; i--) {if(father[x][i] != father[y][i]) {x = father[x][i];y = father[y][i];}}// 返回return father[x][0];
}int n; // 节点数量
List<Integer>[] list = new List[n+1]; // 邻接表
for(int i = 0; i <= n; i++) {list[i] = new ArrayList<>();
}
int[] dep = new int[n+1]; // 每个节点的深度
int[][] father = new int[n+1][21]; // 倍增法,father[x][i]存储x的2^i父节点// 深度搜索,初始化dep数组和father数组
dfs(1, 0);
// 求解x和y的lca
lca(x, y)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 7.Nginx动静分离
  • 为什么电容两端电压不能突变
  • 关于Ubuntu24.04嘉立创EDA无法启动的问题
  • 为CAP面板添加简单的Authentication登录验证功能 C#|.net
  • Echarts 在折线图平滑位置处添加该处信息
  • 迅狐短视频矩阵管理系统核心功能
  • wordpress里面嵌入哔哩哔哩视频的方法
  • Flink任务如何跑起来之 1.DataStream和Transformation
  • (四)React组件、useState、组件样式
  • 男士内裤买便宜还是贵的?2024年高性价比男士内裤汇总分享
  • 戴尔R720服务器(4)虚拟机性能测试
  • feedparser - Python 解析Atom和RSSfeed
  • 49.Python-web框架-Django解决多语言redirect时把post改为get的问题
  • 20块钱就能搞定的FOC无刷电机控制方案!miniFOC
  • AndroidX Navigation 反复创建Fragment问题修复
  • [数据结构]链表的实现在PHP中
  • 3.7、@ResponseBody 和 @RestController
  • gitlab-ci配置详解(一)
  • java正则表式的使用
  • Linux Process Manage
  • MySQL用户中的%到底包不包括localhost?
  • SOFAMosn配置模型
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 初探 Vue 生命周期和钩子函数
  • 从0实现一个tiny react(三)生命周期
  • 高度不固定时垂直居中
  • 使用agvtool更改app version/build
  • 试着探索高并发下的系统架构面貌
  • 微服务核心架构梳理
  • 怎么将电脑中的声音录制成WAV格式
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • $ git push -u origin master 推送到远程库出错
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (AngularJS)Angular 控制器之间通信初探
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (未解决)macOS matplotlib 中文是方框
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)四层和七层负载均衡的区别
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .env.development、.env.production、.env.staging
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core 版本不支持的问题
  • .NET Core中的去虚
  • .Net 高效开发之不可错过的实用工具
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .Net程序帮助文档制作
  • .NET和.COM和.CN域名区别