数据结构篇——算法时间复杂度

如何度量算法的执行时间?

事后统计法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同 算法编制的程序的运行时间进行比较,从而确定算法效率的高低。缺陷:事先编制程序需要 时间,测试需要时间,算法万一效率低,不同测试环境差别很大。

事前分析估算:在计算机程序编写前,依据统计方法对算法进行估算。一个程序在计算 机上运行时所消耗的时间取决于下列因素:算法采用的策略和方案、编译产生的代码质量、 问题的输入规模、机器执行指令的速度。抛开这些与计算机硬件、软件相关的因素,一个程 序的运行时间依赖于算法的好坏和问题的输入规模。


注意:我们研究算法的复杂度,侧重的是研究算法随着输入规模扩大增长量的一个抽 象,而不是精确地定位需要执行多少次,因为如果这样的话,我们就又得考虑回编译器优化问题

函数渐进增长

给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比 g(n)大,那么,我们说f(n)的增长渐进快于g(n)

假设有若干算法解决同一问题,算法的输入规模都是n

算法A:2n+3

算法B:4n+1

算法C:n^2+1

算法D:3n^2+6

算法E:n^2+3n+1

算法F:3n^2+6n+6

对于计算机而言,计算次数往往很多,
所以,常数项、系数和其他次要项均可以忽略不计,主要关注主项和其阶数(最高阶的项)。

算法时间复杂度

 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n 的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记作: T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称 之为算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。(看 潜力,本质上说 执行次数==时间)

一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。 O(1) O(n) O(n^2)

     用常数1取代运行时间中的所有加法常数。

     在修改后的运行次数函数中,只保留最高阶项。

     如果最高阶项存在且不是1,则去除与这个项相乘的常数。

     得到的最后结果就是大O阶


常数阶:O(1)

线性阶:O(n) 一般含有非嵌套循环涉及线性阶,线性阶就是随着问题规模n的扩大,对 应计算次数呈直线增长

平方阶:O(n^2)

对数阶:O(logn)

数据结构篇——算法时间复杂度_第1张图片

数据结构篇——算法时间复杂度_第2张图片

最坏情况与平均情况

我们查找一个有n个随机数字数组中的某个数字,最好的情况是第一个数字就是,那么 算法的时间复杂度为O(1),但也有可能这个数字在最后一个位置,那么时间复杂度为O(n)

平均运行时间是期望的运行时间,最坏运行时间是一种保证。在实际应用中,这是一种 最重要的需求,通常除非特别指定,我们提到的运行时间都是最坏情况的运行时间。

算法空间复杂度

我们在写代码时,完全可以用空间换时间。 判断闰年,可以算法分析,也可事先建立数组进行查询。

算法的空间复杂度通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式为:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。

通常,我们都是用“时间复杂度”来指运行时间的需求,用“空间复杂度”指空间需求 当直接要求让我们求“复杂度“时,通常指的是时间复杂度

你可能感兴趣的:(数据结构篇——算法时间复杂度)