数据结构浅析(七)

    时间复杂度

    一个对小编来说既熟悉又陌生的名字,熟悉是因为提到算法,就会提到时间复杂度,听过不下百十遍,陌生是因为我从来没有仔细的去了解下什么是时间复杂度,今天就让我们一起来窥探下时间复杂度神秘的外纱吧。

    算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作

    T(n) = O(f(n))

    随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称做算法的渐进时间复杂度,简称时间复杂度。

    T:T为Time,时间,这个比较好理解。

    O:全称为“大O符号”,用户描述函数渐进行为的数学符号,对应了算法中增长率的概念(自理解)。

    基本操作: 需要进行重复操作的代码块,例如排序,首先判断比较数值是否满足交换条件,如果满足,进行交换操作,不满足,不进行操作,这一系列操作就属于基本操作。

    语句的频度:该语句重复执行的次数。

    代码片段1: {基本操作} 

    频度1    时间复杂度O(1)  常量阶

    代码片段2: for($i=0;  $i<$n; $ i++){基本操作}

    频度n    时间复杂度O(n)    线性阶

    代码片段3: for($i=0; $i<$n; $i++){ for($j=0; $j<$n;  $j++){基本操作} }

    频度n²    时间复杂度O(n²)    平方阶

    算法可以呈现的时间复杂度有很多种,除了上述三种的情况外还有对数阶O(log n),指数阶O(2ⁿ)等。

    不同阶的时间复杂度对应着不同的基本操作的执行次数,也就是说增长率越快,基本操作的执行次数越多,耗时也就越多,因此,平时我们会尽可能选用增长率慢的阶。

    即便是同一算法对于同一规模的问题,也会因为输入数据的不同而产生不同的基本操作的执行次数。例如对数据{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}和{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}进行从大到小的排序,数据1在同规模中需要进行基本操作的执行次数最多,数据2不需要进行基本操作。

    既然如此,那么时间复杂度应该怎么算?这里就用到最坏时间复杂度。

    最坏时间复杂度:分析最坏的情况,得出执行时间上限。

    上述例子中的对数据{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}进行从大到小的排序,就是同规模问题中的最坏情况。

    通常我们讨论的时间复杂度就是指最坏情况下的时间复杂度。

    空间复杂度

    算法所需存储空间的量度,记做S(n) = O(f(n)),n为问题的规模(或大小)。

猜你喜欢

转载自blog.csdn.net/a7442358/article/details/80225871