php 算法复杂度 时间复杂度 空间复杂度

算法复杂度分为时间复杂度和空间复杂度。

其作用:

时间复杂度是指执行算法所需要的计算工作量;

而空间复杂度是指执行这个算法所需要的内存空间。

(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。

简单来说,

时间复杂度指的是语句执行次数

空间复杂度指的是算法所占的存储空间

时间复杂度

执行算法所需的计算工作量。一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度也因此记做T(n)=O(f(n));
常见时间复杂度有:常数阶、线性阶、平方阶、立方阶、对数阶、nlog2n阶、指数阶
效率:O(1) > O(log2n)> o(n)> o(nlog2n) > o(n^2) > o(n^3) > o(2^n) > o(n!) > o(n^n)

其他概念

最坏情况:最坏情况时的运行时间,一种保证。如果没有特别说明,说的时间复杂度即为最坏情况的时间复杂度

时间复杂度计算方式

举例:计算1+2+3+....+n的和

$sum=0

for($i=1;$i<=$n;$i++){

$sum+=$i

}

可以看到循环了n次,所以时间复杂度就是O(n), 时间复杂度就是程序计算次数

其他说明

1.用常数1来取代所有时间中的所有加法常数

比如上面的例子中,不管n为多少,计算次数都是3,那么时间复杂度为O(1),而不是O(3)

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

比如运算的次数为n^2+1,那么为时间复杂度为o(n^2)

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

2n^2+3n+1 ->n^2

为什么会去掉这些值,看下图

当计算量随着次数原来越大的时候,n和1的区别不是太大,而n2曲线变得越来越大,所以这也是2n2+3n+1 ->n2最后会估量成n2的原因,因为3n+1随着计算次数变大,基本可以忽略不计,其他都类似

常数阶 O(1)

function test($n){

echo $n;

echo $n;

echo $n;

}

不管$n是多少,只运行3次,那么时间复杂度就是O(3),取为O(1)

线性阶 O(n)

for($i=1;$i<=$n;$i++){

$sum+=$i

}

平(立)方阶:o(n2)/o(n3)

$sum=0;

for($i=1;$i<=$n;$i++){

for($j=1;$j<$n;$j++){

$sum+=$j

}

}

两次循环,里面循环执行了n次,外层循环也执行了n次,所以时间复杂度为O(n^2),立方阶一样

特殊平方阶:O(n2/2+n/2)->O(n2)

for(){

for(){

..... ----------->n^2

}

}

+

for(){

------------> n

}

                              +

echo $a+$b --------------> 1

所以整体上计算次数为n^2+n+1,我们算时间复杂度为O(n^2)

对数阶:O(log2n)

如果a的x次方等于N(a>0,且a不等于1),那么数x叫做以a为底N的对数(logarithm),记作x=logaN。其中,a叫做对数的底数,N叫做真数。 [1]

while($n>=1){

$n=$n/2;

}

n 执行次数

1 1

2 2

3 2

规律:

第一次 第二次 第三次 第四次 第五次

20--------->10---------->5-------->2.5------->1

n n/2 n/2/2 n/2/2/2 n/2/2/...

所有规律:n/(2^m)=1;我们需要算出m, 转换成n=2^m,得出m=log2n,所以时间复杂度为O(logn)或者O(log2n)

空间复杂度

算法需要消耗的内存空间。即为S(n)=O(f(n));包括程序代码所占用的空间,输入数据所占用的空间和辅助变量所占用的空间这三个方面。计算和表达方式与时间复杂度类似,一般用复杂度的渐近性来表示

关于O(1)的问题, O(1)是说数据规模和临时变量数目无关,并不是说仅仅定义一个临时变量。举例:无论数据规模多大,我都定义100个变量,这就叫做数据规模和临时变量数目无关。就是说空间复杂度是O(1)。

空间复杂度计算方式

举例:冒泡排序的元素交换,空间复杂度O(1)
冒泡排序就是两两交换,中间设置临时变量存储交换的值,不管要交换的数据多大,临时变量始终为固定数量

冒泡排序:把$arr=[1,3,2,4,6,5]排序出来

原理:两两相邻的数进行比较,如果反序就交换,否则不交换

1 3 2 4 6 5

首先1和3比较,不动

1 3 2 4 6 5

再次3和2比较,交换

1 2 3 4 6 5

再次3和4比较,不动

1 2 3 4 6 5

再次4和6比较,不动

1 2 3 4 6 5

再次6和5比较,交换

1 2 3 4 5 6

for($i=0;$i<=$n;$i++){

for($j=0;$j<=$n;$j++){

if($arr[$j]>$arr[$j+1]){
   $tmp=$arr[$j];
  $arr[$j]=$arr[$j+1];
  $arr[$j+1]=$tmp;
}
}

}

所以时间复杂度为O(n^2),空间复杂度为O(1)

常见排序算法

冒泡排序、直接插入排序、希尔排序、选择排序、快速排序、对排序、归并排序

常见查找算法

二分查找、顺序查找

扩展:函数的渐进增长

https://blog.csdn.net/raylee2...

原文地址:https://www.cnblogs.com/djwhome/p/12554474.html

时间: 2024-08-01 15:07:51

php 算法复杂度 时间复杂度 空间复杂度的相关文章

算法分类 ,时间复杂度 ,空间复杂度,优化算法

算法 今天给大家带来一篇关于算法排序的分类,算法的时间复杂度,空间复杂度,还有怎么去优化算法的文章,喜欢的话,可以关注,有什么问题,可以评论区提问,可以与我私信,有什么好的意见,欢迎提出. 前言: 算法的复杂度分为时间复杂度与空间复杂度,时间复杂度指执行算法需要需要的计算工作量,空间复杂度值执行算法需要的内存量,可能在运行一些小数据的时候,大家体会不到算法的时间与空间带来的体验. 优化算法就是将算法的时间优化到最快,将空间优化到最小,假如你写的mod能够将百度游览器的搜索时间提升0.5秒,那都是

算法基础 -- 简介时间复杂度与空间复杂度

算法是为求解一个问题所需要遵循的.被清楚地指定的简单指令的集合.对于一个问题,一旦给定某种算法并且确定其实正确的,那么重要的一步就是确定该算法将需要多少诸如时间或空间等资源量的问题,这就是时间复杂度和空间复杂度存在的意义.常用时间复杂度和空间复杂度来衡量不同算法的优劣. 一.从数学的角度理解 O(n).Ω(n).o(n)和Θ(n) 通常,我们以函数所处理的数据量来表示算法的性能,也就是说,对于大小为 n 的数据,我们用函数 f(n) 来表示它的算法性能.在很多情况下,我们可以完全确定 f 的具体

算法复杂度

一个算法中的语句执行次数称为语句频度或时间频度.记为T(n).n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化. 算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数.记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度. 一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度 O(1)<O(log 

每个程序员都应该收藏的算法复杂度速查表

算法复杂度这件事 这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 O(Big-O)复杂度.我之前在参加面试前,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时不会被问住.最近这几年,我面试了几家硅谷的初创企业和一些更大一些的公司,如 Yahoo.eBay.LinkedIn 和 Google,每次我都需要准备这个,我就在问自己,“为什么没有人创建一个漂亮的大 O 速查表呢?”所以,为了节省大家的时间,我就创建了这个,希望你喜欢! — Eric 图例 绝佳 不错 一般

算法复杂度,及三种主要排序算法的研究

一.时间复杂度 1.时间频度  T(n),n为问题的规模 即--算法中语句的执行次数.又叫语句频度. 2.时间复杂度 记作 O( f(n) ),这里的f(n)是一个T(n)的同数量级函数. 如O(1)表示算法的语句执行次数为一个常数,不随规模n的增长而增长: 又如T(n)=n^2+3n+4与T(n)=4n^2+2n+1它们的频度不同, 但时间复杂度相同,都为O(n^2). 3.算法的性能 主要用算法的 时间复杂度 的数量级来评价一个算法的时间性能. 二.空间复杂度 S(n),包括3方面: 1.算

java 快速排序 时间复杂度 空间复杂度 稳定性

转自:http://blog.csdn.net/believejava/article/details/38434471 —————————————————————————————————————————————— 1.快速排序的基本思想: 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序. 先看一下这幅图: 把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理:交换了

算法复杂度的理解

算法复杂度的理解 from:http://blog.sina.com.cn/s/blog_4bab8e7f0102vmth.html 算法复杂度分为时间复杂度和空间复杂度. 时间复杂度的计算 ?1.一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了.并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多. 一个算法中的语句执行次数

算法复杂度概述

算法复杂度,即算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源. 一个算法的评价主要从时间复杂度和空间复杂度来考虑. (1)时间频度 一个算法中的语句执行次数称为语句频度或时间频度.记为T(n).算法的时间复杂度是指执行算法所需要的计算工作量. (2)时间复杂度 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数.

再谈算法复杂度

算法复杂度分为时间复杂度和空间复杂度. 时间复杂度用于度量算法运行的时间长短:而空间复杂度则是用于度量算法所需存储空间的大小. 时间复杂度 1.时间频度 一个算法运行所耗费的时间,从理论上是不能算出来的,必须上机运行測试才干知道.但我们不可能也没有必要对每一个算法都上机測试,仅仅需知道哪个算法花费的时间多.哪个算法花费的时间少就能够了. 而且一个算法花费的时间与算法中语句的运行次数成正比例.哪个算法中语句运行次数多,它花费时间就多.一个算法中的语句运行次数称为语句频度或时间频度.记为T(n).