JML系列 优化及时间复杂度可行性证明

符号定义

符号 意义 上限
p p p 网络中Person数量 800
r r r 网络中关系数量 3000
q s q_s qs​ 查询queryStrongLinked数量 20
q r q_r qr​ 查询queryNameRank数量 1000
q b q_b qb​ 查询queryBlockSum数量 3000
q a q_a qa​ 查询queryAgeSum数量 3000
q m q_m qm​ 查询queryMinPath数量 3000

优化方法与复杂度分析

queryBlockSum

并查集

  • 由于不需要删除操作,故采用并查集实现
  • 并查集单次操作的均摊复杂度为 O ( α ( n ) ) O(\alpha(n)) O(α(n)),其中 α \alpha α为一个Ackerman函数相关的,这里可以认为小于常数 4 4 4
  • 每次查询时需遍历每个Person,时间复杂度 O ( α p ) O(\alpha p) O(αp)
  • 动态维护加边的复杂度 O ( α r ) O(\alpha r) O(αr)
  • 总时间复杂度 O ( α p q b + α r ) O(\alpha p q_b+\alpha r) O(αpqb​+αr)上限小于 1 × 1 0 7 1\times10^7 1×107,稳妥

bfs/dfs

  • 考虑到有同学使用bfs实现qbs,故补充对其时间复杂度的讨论
  • 做法大致为 从每个Person作为入口进行Floodfill,对于已经有标记的不再进入,没有标记的则将所有连通的节点做一个新标记,最后统计标记的数量
  • 时间复杂度 O ( q b ( p + r ) ) O(q_b (p+r)) O(qb​(p+r)),上限小于 1 × 1 0 7 1\times10^7 1×107,稳妥

queryAgeSum

  • 采用直接暴力枚举Person进行计数的方法
  • 时间复杂度为 O ( q a p ) O(q_a p) O(qa​p),上限 2.4 × 1 0 6 2.4\times10^6 2.4×106,稳妥

queryNameRank

  • 采用每次查询直接暴力统计的方法
  • 时间复杂度 O ( q r p ) O(q_r p) O(qr​p),上限 8 × 1 0 5 8\times10^5 8×105,稳妥

queryMinPath

  • 采用堆优化Dijkstra算法,因为不需要处理负环
  • 单次单源最短路径时间复杂度 O ( ( p + r ) l o g r ) O((p+r)logr) O((p+r)logr)
  • 总体时间复杂度为 O ( q m ( p + r ) l o g r ) O(q_m (p+r)logr) O(qm​(p+r)logr),上限较大,但由于总指令数限制,还满足关系 q m + p + r ≤ 3000 q_m+p+r\le3000 qm​+p+r≤3000,求极值可估计真实复杂度上限小于 2.5 × 1 0 7 2.5\times10^7 2.5×107
  • 注意此题不写堆优化上限可达 1 × 1 0 9 1\times10^9 1×109大概率被卡
  • 另外spfa已死,不卡是情分,卡是本分,参考NOI2018Day1T1,这本来也是一种及其不稳定的算法

queryStrongLinked

暴力枚举

  • 这种做法需要两步bfs/dfs
  • 第一次判断连通后,枚举去掉所有割点再次bfs判断是否仍然联通,如果都能联通,说明这两个点点双连通
  • 这里的枚举割点是准确条件,但实现的时候如果不想再写一个找割点的算法(还是Tarjan),可以用枚举所有点替代
  • 第二次bfs采用MASK的方法加速,不需要修改原图
  • 总时间复杂度 O ( q s p ( p + r ) ) O(q_s p(p+r)) O(qs​p(p+r))时间复杂度上限可达 4.8 × 1 0 7 4.8\times10^7 4.8×107,应该能过,但有些小小的危险,如果具体实现太丑有可能被卡常,不过相信课程组是善良的
  • 【更新20200515-10:46】 各位大佬所说的两次bfs/dfs的方法是有巨大bug的,MASK第一次的路径有可能把第二次的路径堵了,但第一次的路径如果换一条,就不会堵第二次的路径,建议不要使用这种方法 建议不要使用这种方法 建议不要使用这种方法,另外,上述 4.8 × 1 0 7 4.8\times10^7 4.8×107的复杂度课程组很善良

点双连通分量

  • 大致思路采用Tarjan找点双连通分量,再判断两个点是否具有相同编号(只是大致思路)
  • 单次Tarjan就是dfs的复杂度 O ( p + r ) O(p+r) O(p+r)
  • 判断是否双连通复杂度 O ( p ) O(p) O(p)
  • 时间复杂度 O ( q s ( 2 p + r ) ) O(q_s (2p+r)) O(qs​(2p+r))上限小于 1 × 1 0 5 1\times10^5 1×105,稳妥
  • 需要注意这种做法一定要多做测试!!!

其他

  • 前两次作业的此处省略,没必要写的也省略
  • 如有错误还请指正

[OO] JML系列 优化及时间复杂度可行性证明相关推荐

  1. [OO] Unit3 Summary JML系列

    文章目录 [OO] Unit3 Summary JML系列 JML理论基础 优点 语法基础 常用表达式 方法规格 类型规格 JML工具链 测试工具使用报告 SMT Solver EvoSuite JM ...

  2. 网络流重制版:最大流Dinic,以及EK、Dinic时间复杂度的证明(含坑)

    文章目录 前言 关于最大流 神奇的术语 EK算法 Dinic 时间复杂度 EK Dinic 细节与一些神奇的性质 反向弧的作用以及代码边中的c 合法的f对应流 st有入边,ed有出边 双向边的两种处理 ...

  3. 【C++】2048游戏系列---优化模块第一稿【加载图片】

    [C++]2048游戏系列---优化模块第一稿[加载图片] (更新中--) 参考博客: https://blog.csdn.net/qq_39151563/article/details/104283 ...

  4. 带你深度解锁Webpack系列(优化篇)

    带你深度解锁Webpack系列(优化篇) 本文罗列出了十多种优化方式,大家可以结合自己的项目,选择适当的方式进行优化.这些 Webpack 插件的源码我大多也没有看过,主要是结合 Webpack 官方 ...

  5. 构建二叉堆时间复杂度的证明

    http://blog.csdn.net/linuxtiger/article/details/7172258 如果仅从代码上直观观察,会得出构造二叉堆的时间复杂度为O(n㏒n)的结果,这个结果是错的 ...

  6. YOLO系列优化策略与电力巡检案例

    目录 前言 一.PP-YOLO深度解析 YOLOv3及优化模型 PP-YOLO深度解析 PP-YOLO模型结构 二.YOLO优化策略详解 0. 目标检测模型优化方法 1. YOLOv3-DarkNet ...

  7. OO——JML作业总结

    目录 第三单元博客作业 JML语言理论基础 1.注释结构 2.JML表达式 3.方法规格 4.类型规格 应用工具链 JMLUnitNG使用实例 作业架构设计 第一次作业 第二次作业 第三次作业 BUG ...

  8. python list/tuple/dict/set/deque的简单比较、优化和时间复杂度(表格)

    文章目录 一.关于增删改查 二.关于时间复杂度 2.1.时间复杂度: 2.2.比较: 2.3.特点: 2.4.优化: 一.关于增删改查 序列 list tuple dict set deque 能否增 ...

  9. 对快速排序时间复杂度的证明

    取一个随机数x,把数据分割成集合U,V,其中U都小与x,V都大于x     --------这一步操作进行了n次计算,n是数据总数 再继续对U,V做相同的操作,知道分割成总数为1的集合  ------ ...

最新文章

  1. oracle改字体大小_oracle数据库字体大小
  2. 精解C++的switch语句
  3. LFS 8.3 中文翻译版本发布!
  4. moment获取几小时前_momentjs – 使用时刻在两个日期时间之间获得hh:mm的时差
  5. 【JS 逆向百例】转变思路,少走弯路,X米加密分析
  6. eclipse run on server 点不了finish_分享点经验 | springboot入门及编码
  7. PHP向右侧拉菜单,测试使用中
  8. 定了!特斯拉宣布股东大会和“电池日”活动9月22日举行
  9. 视觉平台搭建——光源选型介绍
  10. 计算机视觉检测车牌号
  11. c语言图书管理系统报告书,c语言图书管理系统实验报告_c语言程序设计报告 图书管理平台_c语言 图书管理平台...
  12. 短信API接口怎么调用
  13. 软件人员kpi制定模板_软件开发人员月度KPI考核指标
  14. python 编写computer类
  15. 笔记本计算机内存都多大,你的电脑速度慢吗?笔记本电脑“内存”到底要多大才够用?...
  16. matlab制作水印,怎么在含有水印的图像中提取出水印
  17. 可视化任务编排拖拉拽的数据集成工具
  18. 计算机领域影响因子3.5什么水平,计算机学科SCI(包括SCI-E)影响因子排名
  19. Java 自定义按时间先后顺序排序集合
  20. GT21L16S2Y点阵数据的读取显示

热门文章

  1. matlab 两个直方图重叠,请教大家在同一坐标下作两组数据的直方图的问题以及hold on问题...
  2. jin tian xin qing gen tian qi yi yang!
  3. 转载--编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议11~15)...
  4. mysql数字有效位_保留十位有效数字
  5. 抓扑克牌的手气——三人手牌发放及叫地主机制
  6. Log4j2 消停了,Logback 开始塌房了?
  7. 使用libx264静态编译库编译FFmpeg
  8. 为西安地铁“让路” 47条公交线路有调整
  9. 口腔内科学试题及答案
  10. 瑞芯微RK2728B方案芯片介绍