PHP算法复杂度的类型和作用是什么,如何理解
Admin 2022-08-24 群英技术资讯 508 次浏览
算法复杂度分为时间复杂度和空间复杂度。
其作用:
时间复杂度是指执行算法所需要的计算工作量;
而空间复杂度是指执行这个算法所需要的内存空间。
(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。
时间复杂度
执行算法所需的计算工作量。一般来说,计算机算法是问题规模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)
常见排序算法
冒泡排序、直接插入排序、希尔排序、选择排序、快速排序、对排序、归并排序
常见查找算法
二分查找、顺序查找
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在本篇文章里小编给大家整理的是关于PHP7创建COOKIE和销毁COOKIE的实例方法,有需要的朋友们可以参考下。
今天小编就为大家分享一篇laravel框架 laravel-admin上传图片到oss的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
PHP使用fread()操作字节:分为1、确认需要读取的字节。2、不确认需要读取的字节,若要获得文件的文件的所有内容,需要使用另一个函数filesize()函数来查看文件的大小。
php7提示500错误的解决办法:1、找到Visual Studio2015和2017以及2019三合一的安装包;2、根据自己系统的版本选择,并下载安装即可。
一个字符串(string)就是由一系列的字符组成,其中每个字符等同于一个字节。字符串变量用于包含有字符的值。在创建字符串之后,我们就可以对它进行操作了。您可以直接在函数中使用字符串,或者把它存储在变量中。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008