首页 > 其他分享 >时间复杂度分析

时间复杂度分析

时间:2023-01-15 10:12:14浏览次数:37  
标签:分析 队尾 log 复杂度 插入 时间 均摊

朴素分析

  • 直接暴力统计计算次数。

摊还分析

聚合分析

  • 核心思想:算出总复杂度然后均摊。

  • 例:

    • 1.“栈”:维护一个栈,支持栈顶插入和一次弹出所有元素。

      • 显然 \(n\) 次操作至多 \(n\) 个点插入,从而最多有 \(n\) 个点弹出。

      • 总复杂度 \(O(2n)\),均摊复杂度 \(O(2)\)。

    • 2.\(vector\) 的复杂度分析(仅考虑队尾插入和申请空间的操作)。

      • 按一般的算法,队尾插入 \(O(1)\),申请空间 \(O(size)\)。

      • 显然至多申请 \(2^{\lceil log_2\ n\rceil}\)的空间,可以向上取到 \(O(2n)\)。然后插入 \(O(n)\),均摊复杂度 \(O(3)\)。

核算法

  • 核心思想:在复杂度较低的操作上“预支”复杂度以防止负债。

  • 注意,低复杂度操作的复杂度并没有真的升高,这种变换只是为了方便统计复杂度。

  • 例:

    • 1.\(vector\) 的复杂度分析(仅考虑队尾插入和申请空间的操作)。
      • 按一般的算法,队尾插入 \(O(1)\),申请空间 \(O(size)\)。

      • 我们考虑把队尾插入的复杂度上升到 \(O(3)\)。

      • 从而上次开出的新点(恰为 \(\dfrac{size}{2}\) 个)每个都有 \(2\) 冗余复杂度。均摊到 \(size\) 个点,冗余为 \(1\),恰好够申请新一倍的空间。

      • 即,总复杂度 \(O(3n)\),均摊复杂度 \(O(3)\)。

      • 有趣的是,通过聚合分析算出的复杂度是往往达不到的,而核算法算出的复杂度是高度近似的(这里仅从计算原理来讲)。

      • 然而如果我们把 \(n\) 取成 \(2\) 的整数次方的话,聚合分析可以得到 \(O(2)\),核算法仍然是 \(O(3)\)(最后存的很大一部分复杂度没有用到)。

      • 这就启示我们,所有摊还分析本质上都是近似复杂度分析,并且常常向上取来保证不炸,从而精度未必非常良好。想要取得尽量精确的复杂度,需要选用正确的摊还方法。

势能分析

  • 核心思想:

    • 1.记当前状态为 \(D\),初始状态(通常为空)为 \(D_0\)。

    • 2.定义势函数 \(\phi(D)\),使得总有 \(\phi(D)\geqslant \phi(D_0)\)。

    • 3.记每种操作的实际代价为 \(c\),定义其摊还代价为 \(c'=c+\phi(now)-\phi(pre)\)。从而有 \(\dfrac{\sum\limits_{i=1}^n c'}{n}\) 给出了一种近似(一般略大于实际)的均摊复杂度。

  • 例:

    • 1.\(KMP\) 的复杂度分析。参见“字符串”。

    • 2.\(splay\) 的复杂度分析。

主定理

  • 其实不一定应该放在这里...

  • 主定理给出了一种求解递归算法或分治算法的时间复杂度的方法。其具体形式如下:

    • 定义 \(T(n)\) 为规模为 \(n\) 的问题在递归算法下的复杂度,且有 \(T(n)=aT(\dfrac{n}{b})+f(n)\),其中 \(f(n)\) 为规模为 \(n\) 的问题在分治后的合并复杂度。

    • 设 \(f(n)=O(n^c),c'=\log_ba\)。则我们有:

\[T(n)=\begin{cases}f(n)=O(n^c),c>c'\\f(n)\times\log_bn=O(n^c\times\log_bn),c=c'\\ O(n^{c'}),c<c'\end{cases} \]

  • 可以简单地这么记忆:两个元素,合并复杂度与 \(n^{\log_b a}\);有主导看主导,没主导带个 \(\log_b a\)。

标签:分析,队尾,log,复杂度,插入,时间,均摊
From: https://www.cnblogs.com/weixin2024/p/17053119.html

相关文章

  • springmvc拦截器及源码分析
    前言springmvc拦截器是我们项目开发中用到的一个功能,常常用于对Handler进行预处理和后处理。本案例来演示一个较简单的springmvc拦截器的使用,并通过分析源码来探究拦截器的......
  • Java学习:ribbon的常用负载均衡算法分析
    1.Ribbon介绍因为微服务是目前互联网公司比较流行的架构,所以spring就提供了一个顶级框架-springcloud,来解决我们在开发微服务架构中遇到的各种各样的问题,今天的主角是sprin......
  • 【核反应堆物理分析】1-反应堆核物理基础:简单单的中子物理学
    HG-NRE-P101反应堆核物理基础1.中子与原子核的作用1.1中子与中子核反应反应堆核物理,实际上就是堆内中子的物理学。中子是组成原子核的粒子之一,其静止质量\(m\)稍大于......
  • Date and Time 日期时间 – 开发中的基础知识
    前言日期,时间几乎是每个项目都会接触到的.作为程序员必须对它有所了解.这篇想聊聊它们的基础知识.  以前写的文章以前写过好几篇,但是非常乱.这篇就作为综合整......
  • 【Python】ass双语字幕时间对齐(手动)
    给定一份ass格式的双语歌词文件,其中日语已经对齐了正确时间,汉语的时间还是乱的。把日语的时间用到汉语上面。日语字幕如下(节选部分):Dialogue:0,0:00:02.98,0:00:08.23,......
  • 暗链扫描工具分析
    因为有的网站被攻击之后会被攻击者悄悄挂上暗链,用来提升恶意网站的搜索权重排名,突发奇想看一下暗链扫描工具是咋做的,去github上翻了一下,这次分析Libra项目地址:https://git......
  • Date时间API
    JDK8之前时间API 1.java.lang.System类  System类提供的publicstaticlongcurrentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时......
  • 【JavaScript】使用WdatePicker.js插件限选一个时间范围(例如一个月)
    需求:公司处理的业务数据比较大,单张表就是几十上百万的。如果不加入指定的条件,指定的时间,限定条数的查。经过多张表的关联查询sql执行速度将会变得特别慢。之前限定时间都是......
  • Java集合之LinkedList源码分析
    LinkedList文章目录​​LinkedList​​​​LinkedList介绍​​​​LinkedList的方法总结​​​​LinkedList源码分析​​​​GetElement​​​​RemoveElement​​​​......
  • Java基础之 Integer 类源码分析
    Integer类源码说明Java中Integer是基本数据类型int的包装类。也就是每一个Integer对象包含一个int类型的属性,是抽象类Number类的子类,位于java.lang包下。部分源码:publicfi......