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

本文主要是介绍蓝桥杯软件赛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)

这篇关于蓝桥杯软件赛Java研究生组/A组)第二章基础算法-第三节:倍增的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1045885

相关文章

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.